/ Hex Artifact Content
Login

Artifact ca8424ef9b807ab86381c5b0450ce4752670e16e:


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: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
7100: 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75  l if true */.  u
7110: 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20  8 fullSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
7130: 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20   extra syncs of 
7140: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
7150: 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20  robustness */.  
7160: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7170: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7180: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
7190: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
71a0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
71b0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
71d0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
71e0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
71f0: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7200: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7210: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7220: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7230: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7240: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7260: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7270: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
7280: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72a0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
72b0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
72c0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72e0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
72f0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
7300: 2f 0a 0a 20 20 2f 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 2a 2a 2a 2a 2a 2a  ****************
7350: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7360: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7370: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7380: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7390: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
73a0: 6f 75 74 69 6e 65 20 6f 70 65 72 74 69 6f 6e 2e  outine opertion.
73b0: 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73 20    Class members 
73c0: 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  not in this bloc
73d0: 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69 78  k are either fix
73e0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  ed.  ** when the
73f0: 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74 20   pager is first 
7400: 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65 20  created or else 
7410: 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65 6e  only change when
7420: 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a 2a   there is a.  **
7430: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f 64   significant mod
7440: 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20 61  e change (such a
7450: 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 70  s changing the p
7460: 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e  age_size, lockin
7470: 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72 20  g_mode,.  ** or 
7480: 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
7490: 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  ).  From another
74a0: 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c 61   view, these cla
74b0: 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72  ss members descr
74c0: 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73 74  ibe.  ** the "st
74d0: 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67 65  ate" of the page
74e0: 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20 63  r, while other c
74f0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73  lass members des
7500: 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20 22  cribe the.  ** "
7510: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 6f  configuration" o
7520: 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  f the pager..  *
7530: 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20 20  /.  u8 eState;  
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20 28  /* Pager state (
7560: 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57 52  OPEN, READER, WR
7570: 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a  ITER_LOCKED..) *
7580: 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20  /.  u8 eLock;   
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20  /* Current lock 
75b0: 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73 65  held on database
75c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 68   file */.  u8 ch
75d0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
75e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
75f0: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
7600: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
7610: 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  ter */.  u8 setM
7620: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
7630: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7640: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
7650: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
7660: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
7670: 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20  tSpill;         
7680: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7690: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 77  pill the cache w
76a0: 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  hen non-zero */.
76b0: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53 70    u8 doNotSyncSp
76c0: 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ill;          /*
76d0: 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70 69   Do not do a spi
76e0: 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ll that requires
76f0: 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20 20   jrnl sync */.  
7700: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
7710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7720: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
7730: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
7740: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
7750: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7770: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7780: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
7790: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
77a0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
77b0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
77c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
77d0: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
77e0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
7800: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
7810: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
7820: 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20 20  no dbHintSize;  
7830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
7840: 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43 4e  ue passed to FCN
7850: 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c  TL_SIZE_HINT cal
7860: 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  l */.  int errCo
7870: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
7880: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
7890: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
78a0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rors */.  int nR
78b0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
78c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a        /* Pages j
78d0: 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20  ournalled since 
78e0: 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72  last j-header wr
78f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63  itten */.  u32 c
7900: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
7910: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
7920: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
7930: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
7940: 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53  ksum */.  u32 nS
7950: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
7960: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7970: 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 74  of records writt
7980: 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61  en to sub-journa
7990: 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  l */.  Bitvec *p
79a0: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
79b0: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
79c0: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
79d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
79e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
79f0: 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20  le *fd;         
7a00: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a10: 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73  ptor for databas
7a20: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7a30: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
7a40: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a50: 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a  iptor for main j
7a60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
7a70: 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20  te3_file *sjfd; 
7a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a90: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73  descriptor for s
7aa0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7ab0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7ad0: 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66  urrent write off
7ae0: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
7af0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
7b00: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
7b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7b20: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
7b30: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
7b40: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
7b50: 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
7b60: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7b70: 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e  o list of ongoin
7b80: 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  g backup process
7b90: 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  es */.  PagerSav
7ba0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
7bb0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
7bc0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
7bd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
7be0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
7bf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7c00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
7c10: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68  epoint[] */.  ch
7c20: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7c30: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7c40: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7c50: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7c60: 67 65 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ges */.  /*.  **
7c70: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7c80: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7c90: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
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 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7cf0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7d10: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7d20: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7d30: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7d40: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
7d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7d60: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
7d70: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
7d80: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
7d90: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
7da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
7db0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
7dc0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
7dd0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
7de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
7df0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
7e00: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
7e10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7e40: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
7e50: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e70: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
7e80: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
7e90: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
7ea0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
7eb0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
7ec0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
7ed0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
7ee0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
7ef0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
7f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7f20: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
7f30: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7f40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7f50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7f60: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
7f70: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
7f80: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
7f90: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
7fa0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
7fb0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
7fc0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
7fd0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
7fe0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53  dler */.  int aS
7ff0: 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20  tat[3];         
8000: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8010: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65  ache hits, misse
8020: 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a  s and writes */.
8030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8040: 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20  ST.  int nRead; 
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
8070: 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  es read */.#endi
8080: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8090: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
80a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
80b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
80c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
80d0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
80e0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
80f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8100: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8110: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8120: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8130: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8140: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8150: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8160: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8170: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8180: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8190: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
81a0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
81b0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
81c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
81d0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
81e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
81f0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8200: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8210: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8220: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8230: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8240: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8250: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8260: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8270: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8280: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8290: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
82a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
82b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
82c0: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
82d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
82e0: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
82f0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8300: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8310: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8320: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8330: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8340: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8350: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65  f.};../*.** Inde
8360: 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68  xes for use with
8370: 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20   Pager.aStat[]. 
8380: 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b  The Pager.aStat[
8390: 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73  ] array contains
83a0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61  .** the values a
83b0: 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69  ccessed by passi
83c0: 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  ng SQLITE_DBSTAT
83d0: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41  US_CACHE_HIT, CA
83e0: 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20  CHE_MISS .** or 
83f0: 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73  CACHE_WRITE to s
8400: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
8410: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ()..*/.#define P
8420: 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20  AGER_STAT_HIT   
8430: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
8440: 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65  STAT_MISS  1.#de
8450: 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f  fine PAGER_STAT_
8460: 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54  WRITE 2../*.** T
8470: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
8480: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
8490: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
84a0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
84b0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
84c0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
84d0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
84e0: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
84f0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
8500: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
8510: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
8520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8530: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
8540: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
8550: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8560: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8570: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
8580: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
8590: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
85a0: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
85b0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
85c0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
85d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
85e0: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
85f0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8600: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
8610: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
8620: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
8630: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
8640: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
8650: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
8660: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
8670: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
8680: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
8690: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
86a0: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
86b0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
86c0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
86d0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
86e0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
86f0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
8700: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
8710: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8720: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
8730: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
8740: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
8750: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
8760: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
8770: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8780: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
8790: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
87a0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
87b0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
87c0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
87d0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
87e0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
87f0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
8800: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
8810: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
8820: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
8830: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
8840: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
8850: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8860: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
8870: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
8880: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
8890: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
88a0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
88b0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
88c0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
88d0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
88e0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
88f0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
8900: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
8910: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
8920: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
8930: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
8940: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
8950: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
8960: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
8970: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
8980: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
8990: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
89a0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
89b0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
89c0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
89d0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
89e0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
89f0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
8a00: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
8a10: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
8a20: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
8a30: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
8a40: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
8a50: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
8a60: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
8a70: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
8a80: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
8a90: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
8aa0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
8ab0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
8ac0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
8ad0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
8ae0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
8af0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
8b00: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
8b10: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
8b20: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
8b30: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
8b40: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
8b50: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
8b60: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
8b70: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
8b80: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
8b90: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
8ba0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
8bb0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
8bc0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
8bd0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
8be0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
8bf0: 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61  f the of each pa
8c00: 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  ge record in the
8c10: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65   journal is give
8c20: 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c  n by.** the foll
8c30: 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  owing macro..*/.
8c40: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
8c50: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
8c60: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
8c70: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
8c80: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8c90: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
8ca0: 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75  pager. This is u
8cb0: 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  sually the same 
8cc0: 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69  .** size as a si
8cd0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
8ce0: 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65  . See also setSe
8cf0: 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23  ctorSize()..*/.#
8d00: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
8d10: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
8d20: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
8d30: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
8d40: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
8d50: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
8d60: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
8d70: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
8d80: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
8d90: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
8da0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
8db0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
8dc0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
8dd0: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
8de0: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
8df0: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
8e00: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
8e10: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
8e20: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
8e30: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
8e40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
8e50: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
8e60: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
8e70: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
8e80: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
8e90: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  if../*.** The ma
8ea0: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
8eb0: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
8ec0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
8ed0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
8ee0: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
8ef0: 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
8f00: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
8f10: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
8f20: 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33  or (type sqlite3
8f30: 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75  _file*)..** Retu
8f40: 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f  rn 0 if it is no
8f50: 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a  t open, or non-z
8f60: 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20  ero (but not 1) 
8f70: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
8f80: 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20  This is so that 
8f90: 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20  expressions can 
8fa0: 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a  be written as:.*
8fb0: 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65  *.**   if( isOpe
8fc0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
8fd0: 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74  { ....**.** inst
8fe0: 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69  ead of.**.**   i
8ff0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  f( pPager->jfd->
9000: 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a  pMethods ){ ....
9010: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65  */.#define isOpe
9020: 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70  n(pFd) ((pFd)->p
9030: 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20  Methods)../*.** 
9040: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
9050: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
9060: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
9070: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
9080: 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63  usual.** rollbac
9090: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72  k journal. Other
90a0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
90b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
90c0: 49 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e  IT_WAL.static in
90d0: 74 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61  t pagerUseWal(Pa
90e0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
90f0: 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e  return (pPager->
9100: 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73  pWal!=0);.}.#els
9110: 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
9120: 55 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65  UseWal(x) 0.# de
9130: 66 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61  fine pagerRollba
9140: 63 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  ckWal(x) 0.# def
9150: 69 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d  ine pagerWalFram
9160: 65 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20  es(v,w,x,y) 0.# 
9170: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
9180: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
9190: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
91a0: 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  ne pagerBeginRea
91b0: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20  dTransaction(z) 
91c0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
91d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
91e0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
91f0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
9200: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
9210: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a  e(pPager) );.**.
9220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
9230: 20 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72   runs many asser
9240: 74 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e  ts to try to fin
9250: 64 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65  d inconsistencie
9260: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65  s in.** the inte
9270: 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
9280: 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a  e Pager object..
9290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73  */.static int as
92a0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
92b0: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61  (Pager *p){.  Pa
92c0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b  ger *pPager = p;
92d0: 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73  ..  /* State mus
92e0: 74 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20  t be valid. */. 
92f0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61   assert( p->eSta
9300: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20  te==PAGER_OPEN. 
9310: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9320: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
9330: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9340: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9350: 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20  ER_LOCKED.      
9360: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9370: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
9380: 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
9390: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
93a0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20  WRITER_DBMOD.   
93b0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
93c0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
93d0: 49 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c  INISHED.       |
93e0: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  | p->eState==PAG
93f0: 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20  ER_ERROR.  );.. 
9400: 20 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f   /* Regardless o
9410: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
9420: 61 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65  ate, a temp-file
9430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61   connection alwa
9440: 79 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20  ys behaves.  ** 
9450: 61 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20  as if it has an 
9460: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
9470: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
9480: 69 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70  ile. It never up
9490: 64 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63  dates.  ** the c
94a0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69  hange-counter fi
94b0: 65 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e  eld, so the chan
94c0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
94d0: 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a   is always set..
94e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
94f0: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9500: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9510: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  SIVE_LOCK );.  a
9520: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9530: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
9540: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
9550: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
9560: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67   useJournal flag
9570: 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a   is clear, the j
9580: 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74  ournal-mode must
9590: 20 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a   be "OFF". .  **
95a0: 20 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72   And if the jour
95b0: 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46  nal-mode is "OFF
95c0: 22 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ", the journal f
95d0: 69 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ile must not be 
95e0: 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  open..  */.  ass
95f0: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
9600: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9610: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d  ALMODE_OFF || p-
9620: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
9630: 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72   assert( p->jour
9640: 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
9650: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c  OURNALMODE_OFF |
9660: 7c 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  | !isOpen(p->jfd
9670: 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
9680: 20 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c   that MEMDB impl
9690: 69 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20  ies noSync. And 
96a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
96b0: 72 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a  rnal. Since .  *
96c0: 2a 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20  * this means an 
96d0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20  in-memory pager 
96e0: 70 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61  performs no IO a
96f0: 74 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74  t all, it cannot
9700: 20 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a   encounter .  **
9710: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
9720: 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46  OERR or SQLITE_F
9730: 55 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ULL during rollb
9740: 61 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e  ack or while fin
9750: 61 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20  alizing .  ** a 
9760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61  journal file. (a
9770: 6c 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d  lthough the in-m
9780: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d  emory journal im
9790: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
97a0: 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51   .  ** return SQ
97b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
97c0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
97d0: 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
97e0: 20 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20   written). It . 
97f0: 20 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65   ** is therefore
9800: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
9810: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r an in-memory p
9820: 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
9830: 65 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74  e ERROR .  ** st
9840: 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ate..  */.  if( 
9850: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
9860: 65 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29  ert( p->noSync )
9870: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
9880: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9890: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
98a0: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  OFF .         ||
98b0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
98c0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
98d0: 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29  DE_MEMORY .    )
98e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
98f0: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
9900: 52 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74  RROR && p->eStat
9910: 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e!=PAGER_OPEN );
9920: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67  .    assert( pag
9930: 65 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29  erUseWal(p)==0 )
9940: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  ;.  }..  /* If c
9950: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69  hangeCountDone i
9960: 73 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45  s set, a RESERVE
9970: 44 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65  D lock or greate
9980: 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20  r must be held. 
9990: 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e   ** on the file.
99a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
99b0: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
99c0: 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50  untDone==0 || pP
99d0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  ager->eLock>=RES
99e0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
99f0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9a00: 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
9a10: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ;..  switch( p->
9a20: 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  eState ){.    ca
9a30: 73 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20  se PAGER_OPEN:. 
9a40: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
9a50: 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73  MDB );.      ass
9a60: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9a70: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9a80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9a90: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
9aa0: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
9ab0: 50 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50  PCache)==0 || pP
9ac0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
9ad0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
9ae0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52      case PAGER_R
9af0: 45 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73  EADER:.      ass
9b00: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9b10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9b20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9b30: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
9b40: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
9b50: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9b60: 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k>=SHARED_LOCK )
9b70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
9b80: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
9b90: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20  RITER_LOCKED:.  
9ba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9bb0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
9bc0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
9bd0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9be0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9bf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
9c00: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
9c10: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
9c20: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45  rt( p->eLock>=RE
9c30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
9c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9c50: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
9c60: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ize==pPager->dbO
9c70: 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  rigSize );.     
9c80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9c90: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9ca0: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
9cb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9cc0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9cd0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
9ce0: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
9cf0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9d00: 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
9d10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9d20: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9d30: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20  ITER_CACHEMOD:. 
9d40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9d50: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9d60: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9d70: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9d80: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9d90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61  );.      if( !pa
9da0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
9db0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9dc0: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
9dd0: 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d  hat if journal_m
9de0: 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61  ode=wal here tha
9df0: 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20  t neither the.  
9e00: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
9e10: 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41   file nor the WA
9e20: 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e  L file are open.
9e30: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75   This happens du
9e40: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
9e50: 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  a rollback trans
9e60: 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74  action that swit
9e70: 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ches from journa
9e80: 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20  l_mode=off.     
9e90: 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c     ** to journal
9ea0: 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20  _mode=wal..     
9eb0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
9ec0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9ed0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9ee0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9ef0: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
9f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
9f10: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9f20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9f30: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
9f40: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9f50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9f60: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
9f70: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
9f80: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9f90: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9fa0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
9fb0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
9fc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9fd0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
9fe0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
9ff0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a000: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a010: 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20  RITER_DBMOD:.   
a020: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a030: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
a040: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a050: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
a060: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
a070: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a080: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a090: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
a0a0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
a0b0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a0c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a0d0: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a0f0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a100: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a110: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a120: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a130: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a140: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a150: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a160: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a170: 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Size<=pPager->db
a180: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a190: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a1a0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a1b0: 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20  FINISHED:.      
a1c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a1d0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a1e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1f0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a200: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a210: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a220: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a230: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a240: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a250: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a260: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a270: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a280: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a290: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a2a0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a2b0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a2c0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65      );.      bre
a2d0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a2e0: 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  GER_ERROR:.     
a2f0: 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62   /* There must b
a300: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
a310: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
a320: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
a330: 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  r if.      ** in
a340: 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
a350: 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65  herwise the page
a360: 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  r should have al
a370: 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20  ready dropped.  
a380: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f      ** back to O
a390: 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20  PEN state..     
a3a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a3b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a3c0: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
a3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a3e0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
a3f0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
a400: 63 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20  che)>0 );.      
a410: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
a420: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
a430: 20 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55   /* ifndef NDEBU
a440: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
a450: 49 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ITE_DEBUG ./*.**
a460: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
a470: 72 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61  r to a human rea
a480: 64 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20  dable string in 
a490: 61 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a  a static buffer.
a4a0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
a4b0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  e state of the P
a4c0: 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
a4d0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
a4e0: 74 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e  t. This.** is in
a4f0: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
a500: 64 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65  d within debugge
a510: 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
a520: 20 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69   as an alternati
a530: 76 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20  ve.** to "print 
a540: 2a 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a  *pPager" in gdb:
a550: 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69  .**.** (gdb) pri
a560: 6e 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f  ntf "%s", print_
a570: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
a580: 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  er).*/.static ch
a590: 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f  ar *print_pager_
a5a0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
a5b0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
a5c0: 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71  Ret[1024];..  sq
a5d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
a5e0: 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20  024, zRet,.     
a5f0: 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20   "Filename:     
a600: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74   %s\n".      "St
a610: 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20  ate:         %s 
a620: 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20  errCode=%d\n".  
a630: 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20      "Lock:      
a640: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
a650: 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20  "Locking mode:  
a660: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c  locking_mode=%s\
a670: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
a680: 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c  l mode:  journal
a690: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
a6a0: 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65    "Backing store
a6b0: 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65  : tempFile=%d me
a6c0: 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61  mDb=%d useJourna
a6d0: 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a  l=%d\n".      "J
a6e0: 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f  ournal:       jo
a6f0: 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f  urnalOff=%lld jo
a700: 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22  urnalHdr=%lld\n"
a710: 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20  .      "Size:   
a720: 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64         dbsize=%d
a730: 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64   dbOrigSize=%d d
a740: 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a  bFileSize=%d\n".
a750: 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65        , p->zFile
a760: 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  name.      , p->
a770: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
a780: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20  EN            ? 
a790: 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20  "OPEN" :.       
a7a0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a7b0: 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20  R_READER        
a7c0: 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20    ? "READER" :. 
a7d0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a7e0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
a7f0: 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45  OCKED   ? "WRITE
a800: 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20  R_LOCKED" :.    
a810: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a820: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a830: 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43  EMOD ? "WRITER_C
a840: 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20  ACHEMOD" :.     
a850: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a860: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
a870: 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42      ? "WRITER_DB
a880: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a890: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a8a0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
a8b0: 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ? "WRITER_FINISH
a8c0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a8d0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
a8e0: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f  RROR           ?
a8f0: 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72   "ERROR" : "?err
a900: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
a910: 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  t)p->errCode.   
a920: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
a930: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
a940: 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20   "NO_LOCK" :.   
a950: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52       p->eLock==R
a960: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f  ESERVED_LOCK   ?
a970: 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20   "RESERVED" :.  
a980: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
a990: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
a9a0: 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a  ? "EXCLUSIVE" :.
a9b0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
a9c0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  ==SHARED_LOCK   
a9d0: 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20    ? "SHARED" :. 
a9e0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
a9f0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20  =UNKNOWN_LOCK   
aa00: 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22   ? "UNKNOWN" : "
aa10: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
aa20: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
aa30: 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20  e ? "exclusive" 
aa40: 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20  : "normal".     
aa50: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64   , p->journalMod
aa60: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aa70: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20  MODE_MEMORY   ? 
aa80: 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20  "memory" :.     
aa90: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
aaa0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aab0: 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20  MODE_OFF      ? 
aac0: 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20  "off" :.        
aad0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aae0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aaf0: 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65  E_DELETE   ? "de
ab00: 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  lete" :.        
ab10: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
ab20: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ab30: 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65  E_PERSIST  ? "pe
ab40: 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20  rsist" :.       
ab50: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
ab60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
ab70: 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74  DE_TRUNCATE ? "t
ab80: 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20  runcate" :.     
ab90: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
aba0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
abb0: 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20  MODE_WAL      ? 
abc0: 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f  "wal" : "?error?
abd0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
abe0: 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74  ->tempFile, (int
abf0: 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29  )p->memDb, (int)
ac00: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  p->useJournal.  
ac10: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
ac20: 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48  Off, p->journalH
ac30: 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  dr.      , (int)
ac40: 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29  p->dbSize, (int)
ac50: 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28  p->dbOrigSize, (
ac60: 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a  int)p->dbFileSiz
ac70: 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e.  );..  return
ac80: 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
ac90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
aca0: 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65  ue if it is nece
acb0: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70  ssary to write p
acc0: 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68  age *pPg into th
acd0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a  e sub-journal..*
ace0: 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74  * A page needs t
acf0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
ad00: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
ad10: 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  l if there exist
ad20: 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  s one.** or more
ad30: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
ad40: 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a   for which:.**.*
ad50: 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e  *   * The page-n
ad60: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
ad70: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50  an or equal to P
ad80: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f  agerSavepoint.nO
ad90: 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  rig, and.**   * 
ada0: 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  The bit correspo
adb0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  nding to the pag
adc0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  e-number is not 
add0: 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61  set in.**     Pa
ade0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
adf0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  Savepoint..*/.st
ae00: 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71  atic int subjReq
ae10: 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20  uiresPage(PgHdr 
ae20: 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67  *pPg){.  Pgno pg
ae30: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
ae40: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
ae50: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
ae60: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
ae70: 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  0; i<pPager->nSa
ae80: 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  vepoint; i++){. 
ae90: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
aea0: 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
aeb0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20  aSavepoint[i];. 
aec0: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e     if( p->nOrig>
aed0: 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69  =pgno && 0==sqli
aee0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d  te3BitvecTest(p-
aef0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
af00: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  gno) ){.      re
af10: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
af20: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
af30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
af40: 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
af50: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
af60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
af70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
af80: 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72  eInJournal(PgHdr
af90: 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
afa0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
afb0: 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  st(pPg->pPager->
afc0: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
afd0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
afe0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
aff0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
b000: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b010: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
b020: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
b030: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
b040: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
b050: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
b060: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
b070: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
b080: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
b090: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
b0a0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
b0b0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b0c0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b0d0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b0e0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b0f0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b100: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b110: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b120: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b130: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b140: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b150: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b160: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b170: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b180: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b190: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b1a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b1b0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b1c0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b1d0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b1e0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b1f0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b200: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b210: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b220: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b230: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b240: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b250: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b260: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b270: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b280: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b290: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b2a0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b2c0: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b2d0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b2e0: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b2f0: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b300: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
b310: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
b320: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
b330: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
b340: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
b350: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b360: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b370: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b380: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
b390: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
b3a0: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
b3b0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
b3c0: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
b3d0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
b3e0: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
b3f0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
b400: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
b410: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
b420: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
b430: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b440: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b450: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b460: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
b470: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
b480: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
b490: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
b4a0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
b4b0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
b4c0: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b4d0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
b4e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b4f0: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
b500: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b510: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b520: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b530: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
b540: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
b550: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
b560: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
b570: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
b580: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
b590: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
b5a0: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
b5b0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
b5c0: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
b5d0: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
b5e0: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
b5f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
b600: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
b610: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b620: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
b630: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
b640: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b650: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
b660: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
b670: 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65  r->eLock = (u8)e
b680: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Lock;.    }.    
b690: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
b6a0: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
b6b0: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20  r, eLock)).  }. 
b6c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6d0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61  *.** Lock the da
b6e0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b6f0: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b700: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b710: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a   SHARED_LOCK,.**
b720: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
b730: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
b740: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
b750: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  is successful, s
b760: 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  et the.** Pager.
b770: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b780: 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  o the new lockin
b790: 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  g state. .**.** 
b7a0: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b7b0: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b7c0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b7d0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b7e0: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20   is .** called, 
b7f0: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b800: 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20   unless the new 
b810: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73  locking state is
b820: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
b830: 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d   .** See the com
b840: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b850: 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57  define of UNKNOW
b860: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b870: 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66  planation .** of
b880: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b890: 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62   int pagerLockDb
b8a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b8b0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b8c0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b8d0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  ;..  assert( eLo
b8e0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b8f0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  || eLock==RESERV
b900: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
b910: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b920: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
b930: 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c  ->eLock<eLock ||
b940: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
b950: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
b960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b970: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
b980: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
b990: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b9a0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
b9b0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
b9c0: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
b9d0: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
b9e0: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
b9f0: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
ba00: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
ba10: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
ba20: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
ba30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
ba40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
ba50: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
ba60: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
ba70: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
ba80: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
ba90: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
baa0: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
bab0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
bac0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
bad0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
bae0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
baf0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
bb00: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
bb10: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
bb20: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
bb30: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
bb40: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
bb50: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
bb60: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
bb70: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
bb80: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
bb90: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
bba0: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
bbb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
bbc0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
bbd0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
bbe0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
bbf0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
bc00: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
bc10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
bc20: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
bc30: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
bc40: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
bc50: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
bc60: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
bc70: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
bc80: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
bc90: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
bca0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bcb0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
bcc0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
bcd0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
bce0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
bcf0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
bd00: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
bd10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bd20: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
bd30: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
bd40: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
bd50: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
bd60: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
bd70: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
bd80: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
bd90: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
bdc0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
bdd0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
be00: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
be10: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
be20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
be30: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
be40: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
be50: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
be60: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
be70: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
be80: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
be90: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
bea0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
beb0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
bec0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
bed0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
bee0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
bef0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
bf00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
bf10: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
bf20: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
bf30: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
bf40: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
bf50: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
bf60: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
bf70: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
bf80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bf90: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
bfa0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bfb0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
bfc0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
bfd0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
bfe0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
bff0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
c000: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
c010: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
c020: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
c030: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
c040: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
c050: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
c060: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
c070: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
c080: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c090: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
c0a0: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
c0b0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
c0c0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
c0d0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
c0e0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
c0f0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
c100: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
c110: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
c120: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c130: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
c140: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
c150: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
c160: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
c170: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
c180: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
c190: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
c1a0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
c1b0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
c1c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
c1d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
c1e0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
c1f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c200: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
c210: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
c220: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
c230: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
c240: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
c250: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
c260: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
c270: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
c280: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
c290: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
c2a0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
c2b0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
c2c0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
c2d0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
c2e0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
c2f0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
c300: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
c310: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
c320: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
c330: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
c340: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
c350: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
c360: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
c370: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
c380: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
c390: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
c3a0: 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
c3b0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
c3c0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d  .  assert( (pPg-
c3d0: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
c3e0: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
c3f0: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
c400: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
c410: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
c420: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
c430: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
c440: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
c450: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c460: 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a  set_pagehash(X).
c470: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c480: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
c490: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c4a0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
c4b0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
c4c0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
c4d0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
c4e0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
c4f0: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
c500: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
c510: 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ead a master jou
c520: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66  rnal file name f
c530: 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20  rom the .** end 
c540: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c  of the file and,
c550: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
c560: 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d  copies it into m
c570: 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a  emory supplied .
c580: 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
c590: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
c5a0: 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72  bove writeMaster
c5b0: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68  Journal() for th
c5c0: 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64  e format.** used
c5d0: 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74   to store a mast
c5e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c5f0: 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20  name at the end 
c600: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  of a journal fil
c610: 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72  e..**.** zMaster
c620: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
c630: 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
c640: 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65  ast nMaster byte
c650: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
c660: 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  * the caller. Th
c670: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c  is should be sql
c680: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
c690: 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65  ame+1 (to ensure
c6a0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f   there is.** eno
c6b0: 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69  ugh space to wri
c6c0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c6d0: 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20  urnal name). If 
c6e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c6f0: 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  al.** name in th
c700: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e  e journal is lon
c710: 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72  ger than nMaster
c720: 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e   bytes (includin
c730: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
c740: 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69  nator), then thi
c750: 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  s is handled as 
c760: 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  if no master jou
c770: 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72  rnal name.** wer
c780: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
c790: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c7a0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
c7b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c7c0: 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20   present at the 
c7d0: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
c7e0: 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  al.** file, then
c7f0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
c800: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
c810: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
c820: 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65  ter. A.** nul-te
c830: 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
c840: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
c850: 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e   buffer followin
c860: 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  g the master.** 
c870: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c880: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  e..**.** If it i
c890: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  s determined tha
c8a0: 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  t no master jour
c8b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c8c0: 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61   present .** zMa
c8d0: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
c8e0: 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
c8f0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
c900: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
c910: 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69  curs while readi
c920: 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
c930: 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c  nal file, an SQL
c940: 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  ite.** error cod
c950: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
c960: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
c970: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
c980: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
c990: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
c9a0: 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b  r, u32 nMaster){
c9b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c9d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
c9e0: 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20    u32 len;      
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ca00: 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  Length in bytes 
ca10: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
ca20: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20  l name */.  i64 
ca30: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
ca40: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
ca50: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
ca60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a   journal file pJ
ca70: 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  rnl */.  u32 cks
ca80: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
ca90: 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73      /* MJ checks
caa0: 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  um value read fr
cab0: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  om journal */.  
cac0: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
cad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
cae0: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
caf0: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
cb00: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
cb10: 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20  ;   /* A buffer 
cb20: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
cb30: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d  c header */.  zM
cb40: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
cb50: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
cb60: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cb70: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
cb80: 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73  , &szJ)).   || s
cb90: 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49  zJ<16.   || SQLI
cba0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
cbb0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cbc0: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20  zJ-16, &len)).  
cbd0: 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72   || len>=nMaster
cbe0: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cbf0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cc00: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cc10: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
cc20: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cc30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cc40: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
cc50: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
cc60: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
cc70: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
cc80: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
cc90: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cca0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
ccb0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
ccc0: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
ccd0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
cce0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
ccf0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
cd00: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
cd10: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
cd20: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
cd30: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
cd40: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
cd50: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
cd60: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
cd70: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
cd80: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
cd90: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
cda0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
cdb0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
cdc0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cdd0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
cde0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
cdf0: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
ce00: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
ce10: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
ce20: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
ce30: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
ce40: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
ce50: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
ce60: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
ce70: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
ce80: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
ce90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cea0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
ceb0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
cec0: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
ced0: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
cee0: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
cef0: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
cf00: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
cf10: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
cf20: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
cf30: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
cf40: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
cf50: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
cf60: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
cf70: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
cf80: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
cf90: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
cfa0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
cfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cfd0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
cfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
cff0: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
d020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d030: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d050: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
d060: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
d070: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
d080: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
d090: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
d0a0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
d0b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d0c0: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d0d0: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d0e0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d0f0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d100: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d110: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d120: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d130: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d140: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d150: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d160: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d170: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d180: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d190: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d1a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d1b0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d1c0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d1d0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d1e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d1f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d200: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d210: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d220: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d230: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d240: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d250: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d260: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d270: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d280: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d290: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d2a0: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d2b0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d2c0: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d2d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d2e0: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d2f0: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d300: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d310: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d320: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d330: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d340: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d350: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d360: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d370: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d380: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d390: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d3a0: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d3b0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d3c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d3d0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d3e0: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d3f0: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d400: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d410: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d420: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d430: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d440: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d450: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d460: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d470: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d480: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d490: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d4a0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d4b0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d4c0: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d4d0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d4e0: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d4f0: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d500: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d510: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d520: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d530: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d540: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d550: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d560: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d570: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d580: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d590: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d5a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d5b0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d5c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d5d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
d600: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
d610: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
d620: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
d630: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
d640: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
d650: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
d660: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d670: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
d680: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
d690: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
d6a0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
d6b0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
d6c0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
d6d0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
d6e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
d6f0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
d700: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
d710: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
d720: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
d730: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
d740: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d750: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
d760: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
d770: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
d780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d790: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d7a0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
d7b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d7c0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
d7d0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
d7e0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
d7f0: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
d800: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d810: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d820: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
d830: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
d840: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
d850: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
d860: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
d870: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
d880: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
d890: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
d8a0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
d8b0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
d8c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
d8d0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
d8e0: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
d8f0: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
d900: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
d910: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
d920: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
d930: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
d940: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
d950: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d960: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
d970: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d980: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
d990: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
d9a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d9b0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
d9c0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
d9d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d9e0: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
d9f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
da00: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
da10: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
da20: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
da30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
da40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
da50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
da60: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
da70: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
da80: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
da90: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
daa0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
dab0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
dac0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
dad0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
dae0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
daf0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
db00: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
db10: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
db20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
db30: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
db40: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
db50: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
db60: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
db70: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
db80: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
db90: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
dba0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dbb0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
dbc0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
dbd0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
dbe0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
dbf0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
dc00: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
dc10: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
dc20: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
dc30: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
dc40: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
dc50: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
dc60: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
dc70: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
dc80: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
dc90: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
dca0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
dcb0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
dcc0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
dcd0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
dce0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
dcf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dd00: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
dd10: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
dd20: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
dd30: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
dd40: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
dd50: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
dd60: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
dd70: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
dd80: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
dd90: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
dda0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
ddb0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
dde0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
ddf0: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
de00: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
de20: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
de30: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
de40: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
de50: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
de60: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
de70: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
de80: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
de90: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
dea0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
deb0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
dec0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
ded0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
dee0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
def0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
df00: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
df10: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
df20: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
df30: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
df40: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
df50: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
df60: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
df70: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
df80: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
df90: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
dfa0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
dfb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
dfc0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
dfd0: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
dfe0: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
dff0: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
e000: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
e010: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
e020: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
e030: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
e040: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e050: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
e060: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
e070: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
e080: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
e090: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
e0a0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
e0b0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e0c0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e0d0: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e0e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e0f0: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e100: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e110: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e120: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e130: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e140: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e150: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e160: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e170: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e180: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e190: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e1a0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e1b0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e1c0: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e1d0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e1e0: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e1f0: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e200: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e210: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e220: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e230: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e240: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e250: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e270: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e280: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e290: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e2a0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e2b0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e2c0: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e2d0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e2e0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e2f0: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e300: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e310: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e320: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e330: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e340: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e350: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e360: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e370: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e380: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e390: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e3a0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e3b0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e3c0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e3d0: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e3e0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e3f0: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e400: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e410: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e420: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e430: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e440: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e450: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e460: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e470: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e480: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e490: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e4a0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e4b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e4c0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e4d0: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e4e0: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e4f0: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e500: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e510: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e520: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e530: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e540: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e550: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e560: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e570: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e580: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e590: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e5a0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e5b0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e5c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e5d0: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e5e0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e5f0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
e600: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
e610: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
e620: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e630: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
e640: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
e650: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e660: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e670: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
e680: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
e690: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
e6a0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
e6b0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e6c0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e6d0: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
e6e0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
e6f0: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
e700: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
e710: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
e720: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e730: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
e750: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
e760: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
e770: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
e780: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e790: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e7a0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
e7b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
e7c0: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
e7d0: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
e7e0: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
e7f0: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
e800: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
e810: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
e820: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
e830: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
e840: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
e850: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
e860: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
e870: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
e880: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
e890: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
e8a0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
e8b0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
e8c0: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
e8d0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e8e0: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
e8f0: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
e900: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
e910: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
e920: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
e930: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
e940: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
e950: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
e960: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
e970: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
e980: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e990: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
e9a0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
e9b0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
e9c0: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
e9d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
e9e0: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
e9f0: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
ea00: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
ea10: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
ea20: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
ea30: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
ea40: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
ea50: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
ea60: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
ea70: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
ea80: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
ea90: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
eaa0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
eab0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
eac0: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
ead0: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
eae0: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
eaf0: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
eb00: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
eb10: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
eb20: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
eb30: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
eb40: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
eb50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
eb60: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
eb70: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
eb80: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
eb90: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
eba0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
ebb0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
ebc0: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
ebd0: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
ebe0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
ebf0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
ec00: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
ec10: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
ec20: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
ec30: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
ec40: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
ec50: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
ec60: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
ec70: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
ec80: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
ec90: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
eca0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
ecb0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
ecc0: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
ecd0: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
ece0: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
ecf0: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
ed00: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
ed10: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
ed20: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
ed30: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
ed40: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
ed50: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
ed60: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ed70: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
ed80: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
ed90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
eda0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
edb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
edc0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
edd0: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
ede0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
edf0: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
ee00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ee10: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
ee20: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
ee30: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
ee40: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
ee50: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
ee60: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
ee70: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
ee80: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
ee90: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
eea0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
eeb0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
eec0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
eed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
eee0: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
eef0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
ef00: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
ef10: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
ef20: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
ef30: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
ef40: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
ef50: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
ef60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
ef70: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
ef80: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
ef90: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
efa0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
efb0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
efc0: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
efd0: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
efe0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
eff0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
f000: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
f010: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
f020: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
f030: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
f040: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
f050: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
f060: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
f070: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
f080: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
f090: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
f0a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
f0b0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f0c0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f0d0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f0e0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f0f0: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f100: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f110: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f120: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f130: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f140: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f150: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f160: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f170: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f180: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f190: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f1a0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f1b0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f1c0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f1d0: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f1e0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f1f0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f200: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f210: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f220: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f240: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f250: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f260: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f270: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f280: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f290: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f2a0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f2b0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f2c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f2e0: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f2f0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f300: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f310: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f320: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f330: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f340: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f350: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f360: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f370: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f380: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f390: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f3a0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f3b0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f3c0: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f3d0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f3e0: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f3f0: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f400: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f410: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f420: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f430: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f440: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f450: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f470: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f480: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f490: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f4a0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f4b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f4c0: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f4d0: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f4e0: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f500: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f510: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f520: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f530: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f540: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f550: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f560: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f570: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f580: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f590: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f5a0: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f5b0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f5c0: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f5d0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f5e0: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f5f0: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
f600: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
f610: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
f620: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
f630: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f640: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
f650: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
f660: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
f670: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
f680: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
f690: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
f6a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f6b0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
f6c0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
f6d0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f6e0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
f6f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f700: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
f710: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
f720: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
f730: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
f740: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
f750: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
f760: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
f770: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
f780: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
f790: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
f7a0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
f7b0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
f7c0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f7d0: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
f7e0: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
f7f0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
f800: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f810: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f820: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
f830: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f840: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f850: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f860: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
f870: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
f880: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f890: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f8a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f8b0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
f8c0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
f8d0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
f8e0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f8f0: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
f900: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
f910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f920: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f930: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f940: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
f950: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
f960: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
f970: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
f980: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
f990: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
f9a0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
f9b0: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
f9c0: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
f9d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
f9e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f9f0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fa00: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
fa10: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
fa20: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
fa30: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fa40: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fa50: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
fa60: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
fa70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fa80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fa90: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
faa0: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
fab0: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fac0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fad0: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fae0: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
faf0: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
fb00: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
fb10: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
fb20: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
fb30: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
fb40: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
fb50: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
fb60: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
fb70: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
fb80: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
fb90: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
fba0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
fbb0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
fbc0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
fbd0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
fbe0: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
fbf0: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
fc00: 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
fc10: 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
fc20: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
fc30: 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
fc40: 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
fc50: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
fc60: 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
fc70: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
fc80: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
fc90: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
fca0: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
fcb0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
fcc0: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
fcf0: 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
fd00: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
fd10: 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
fd20: 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
fd30: 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
fd40: 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
fd50: 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
fd60: 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
fd70: 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
fd80: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
fd90: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
fda0: 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
fdb0: 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
fdc0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
fdd0: 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
fde0: 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
fdf0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
fe00: 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
fe10: 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
fe20: 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
fe30: 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
fe40: 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
fe50: 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
fe60: 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
fe70: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
fe80: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
fe90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
fea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
feb0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
fec0: 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
fed0: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
fee0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
fef0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
ff00: 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
ff10: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
ff20: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
ff30: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
ff40: 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
ff50: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
ff60: 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
ff70: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
ff80: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
ff90: 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
ffa0: 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
ffb0: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
ffc0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
ffd0: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
ffe0: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
fff0: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
10000 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
10010 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
10020 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
10030 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
10040 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
10050 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
10060 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
10070 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
10080 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
10090 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
100a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
100b0 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
100c0 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
100d0 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
100e0 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
100f0 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10100 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10110 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10120 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10130 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10140 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10150 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10160 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
10170 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
10180 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
10190 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
101a0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
101b0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
101c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
101d0 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
101e0 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
101f0 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10200 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10210 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10220 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10230 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10240 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10250 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10260 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
10270 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
10280 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10290 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
102a0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
102b0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
102c0 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
102d0 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
102e0 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
102f0 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10300 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10310 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10320 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10330 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10340 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10350 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
10360 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
10370 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
10380 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
10390 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
103a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
103b0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
103c0 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
103d0 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
103e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103f0 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10400 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10410 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10420 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10430 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10440 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10450 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
10460 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
10470 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
10480 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
10490 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
104a0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
104b0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
104c0 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
104d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
104e0 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
104f0 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10500 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10510 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10520 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10550 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
10560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10570 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
10580 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
10590 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
105a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
105b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
105c0 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
105d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
105e0 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10610 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10620 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10630 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10640 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10650 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
10660 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
10670 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
10680 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
10690 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
106a0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
106b0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
106c0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
106d0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
106e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
106f0 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  RY .   || pPager
10700 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10710 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10720 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72  _OFF .  ){.    r
10730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10740 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
10750 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20  etMaster = 1;.  
10760 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
10770 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
10780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10790 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
107a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
107b0 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
107c0 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
107d0 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
107e0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
107f0 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10800 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10810 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10820 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10830 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10840 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10850 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10860 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10870 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10880 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10890 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
108a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108b0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
108c0 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
108d0 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
108e0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
108f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10900 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10910 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10920 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10930 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10940 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10950 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10960 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10970 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10980 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10990 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
109a0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
109b0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
109c0 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
109d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
109e0 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
109f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10a00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10a10 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10a20 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10a30 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10a40 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10a50 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10a60 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
10a70 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
10a80 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
10a90 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
10aa0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10ab0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10ac0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10ad0 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
10ae0 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
10af0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10b00 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10b10 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
10b20 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
10b30 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10b40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10b50 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
10b60 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
10b70 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
10b80 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
10b90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10ba0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
10bb0 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
10bc0 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  er+20);..  /* If
10bd0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10be0 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
10bf0 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
10c00 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
10c10 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
10c20 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
10c30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
10c40 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
10c50 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
10c60 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
10c70 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
10c80 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
10c90 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
10ca0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
10cb0 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
10cc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
10cd0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
10ce0 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
10cf0 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10d00 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
10d10 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
10d20 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
10d30 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
10d40 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
10d50 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
10d60 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
10d70 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
10d80 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
10d90 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
10da0 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
10db0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
10dc0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
10dd0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10de0 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
10df0 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  ).   && jrnlSize
10e00 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  >pPager->journal
10e10 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
10e20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
10e30 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
10e40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10e50 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
10e60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10e70 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
10e80 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
10e90 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
10ea0 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  ber. Return.** a
10eb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10ec0 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
10ed0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
10ee0 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c  ge is not .** al
10ef0 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e  ready in memory.
10f00 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
10f10 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
10f20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
10f30 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
10f40 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10f60 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
10f70 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
10f80 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
10f90 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65  call to PcacheFe
10fa0 74 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74  tch() with creat
10fb0 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a  eFlag==0 to.  **
10fc0 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20   fail, since no 
10fd0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
10fe0 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  ate dynamic memo
10ff0 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e  ry will be made.
11000 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
11010 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
11020 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11030 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a  , pgno, 0, &p);.
11040 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
11050 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
11060 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11070 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
11080 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11090 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
110a0 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
110b0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
110c0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
110d0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
110e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
110f0 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
11100 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
11110 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
11120 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
11130 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
11140 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
11150 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
11160 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
11170 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
11180 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
11190 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
111a0 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
111b0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
111c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
111d0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
111e0 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
111f0 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
11200 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
11210 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11220 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
11230 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
11240 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11250 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
11260 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
11270 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
11280 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11290 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
112a0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
112b0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
112c0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
112d0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
112e0 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
112f0 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
11300 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
11310 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
11320 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
11330 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
11340 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
11350 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
11360 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
11370 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
11380 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
11390 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ubRec = 0;.}../*
113a0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
113b0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
113c0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
113d0 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a  t.pInSavepoint .
113e0 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c  ** bitvecs of al
113f0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
11400 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  s. Return SQLITE
11410 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
11420 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  l.** or SQLITE_N
11430 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
11440 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
11450 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
11460 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
11470 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
11480 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
11490 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
114a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
114b0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
114c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
114d0 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
114e0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  sult code */..  
114f0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11500 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11510 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65   ii++){.    Page
11520 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
11530 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
11540 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  int[ii];.    if(
11550 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20   pgno<=p->nOrig 
11560 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73  ){.      rc |= s
11570 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
11580 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
11590 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65   pgno);.      te
115a0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
115b0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
115c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
115d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
115e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
115f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11600 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11610 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11620 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
11630 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11640 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f  sive mode and no
11650 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f  t.** in the ERRO
11660 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
11670 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20  se, it switches 
11680 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47  the pager to PAG
11690 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65  ER_OPEN.** state
116a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
116b0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
116c0 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
116d0 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61  mode, the databa
116e0 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f  se file is.** co
116f0 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65  mpletely unlocke
11700 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  d. If the file i
11710 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74  s unlocked and t
11720 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  he file-system d
11730 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62  oes.** not exhib
11740 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42  it the UNDELETAB
11750 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f  LE_WHEN_OPEN pro
11760 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e  perty, the journ
11770 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c  al file is.** cl
11780 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f  osed (if it is o
11790 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pen)..**.** If t
117a0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45  he pager is in E
117b0 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
117c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
117d0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a   called, the .**
117e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
117f0 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65   pager cache are
11800 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72   discarded befor
11810 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b  e switching back
11820 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e   to .** the OPEN
11830 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65   state. Regardle
11840 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
11850 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11860 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20  clusive-mode.** 
11870 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72  or not, any jour
11880 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e  nal file left in
11890 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
118a0 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
118b0 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  .** as a hot-jou
118c0 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
118d0 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69  back the next ti
118e0 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  me a read-transa
118f0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e  ction.** is open
11900 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62  ed (by this or b
11910 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e  y any other conn
11920 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74  ection)..*/.stat
11930 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
11940 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
11950 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  er){..  assert( 
11960 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11970 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
11980 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
11990 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
119a0 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  EN .       || pP
119b0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
119c0 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a  GER_ERROR .  );.
119d0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
119e0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
119f0 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
11a00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
11a10 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  l = 0;.  release
11a20 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
11a30 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61  ager);..  if( pa
11a40 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
11a50 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
11a60 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
11a70 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c  >jfd) );.    sql
11a80 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
11a90 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
11aa0 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61  ->pWal);.    pPa
11ab0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
11ac0 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GER_OPEN;.  }els
11ad0 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
11ae0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
11af0 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b10 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
11b20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65  returned by page
11b30 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20  rUnlockDb() */. 
11b40 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f     int iDc = isO
11b50 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f  pen(pPager->fd)?
11b60 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11b70 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
11b80 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20  Pager->fd):0;.. 
11b90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65     /* If the ope
11ba0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75  rating system su
11bb0 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f  pport deletion o
11bc0 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68  f open files, th
11bd0 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20  en.    ** close 
11be0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11bf0 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
11c00 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
11c10 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
11c20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   ** another conn
11c30 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
11c40 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
11c50 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65  might delete the
11c60 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74   file.    ** out
11c70 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
11c80 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11c90 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11ca0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26  LMODE_MEMORY   &
11cb0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11cc0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11cd0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
11ce0 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11cf0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11d00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
11d10 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
11d20 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11d30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
11d40 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20  ELETE   & 5)!=1 
11d50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11d60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11d70 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
11d80 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11d90 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11da0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20  MODE_PERSIST  & 
11db0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  5)==1 );.    if(
11dc0 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54   0==(iDc & SQLIT
11dd0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
11de0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20  BLE_WHEN_OPEN). 
11df0 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65      || 1!=(pPage
11e00 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26  r->journalMode &
11e10 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   5).    ){.     
11e20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11e30 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
11e40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
11e50 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
11e60 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
11e70 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  nd the call to u
11e80 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
11e90 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66  se.    ** file f
11ea0 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75  ails, set the cu
11eb0 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e  rrent lock to UN
11ec0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
11ed0 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20  the comment.    
11ee0 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  ** above the #de
11ef0 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e  fine for UNKNOWN
11f00 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
11f10 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20  lanation of why 
11f20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e  this.    ** is n
11f30 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
11f40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
11f50 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
11f60 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  NO_LOCK);.    if
11f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11f80 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
11f90 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e==PAGER_ERROR )
11fa0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
11fb0 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f  eLock = UNKNOWN_
11fc0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LOCK;.    }..   
11fd0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74   /* The pager st
11fe0 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67  ate may be chang
11ff0 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52  ed from PAGER_ER
12000 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ROR to PAGER_OPE
12010 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69  N here.    ** wi
12020 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74  thout clearing t
12030 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  he error code. T
12040 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e  his is intention
12050 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20  al - the error. 
12060 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c     ** code is cl
12070 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61  eared and the ca
12080 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65  che reset in the
12090 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20   block below..  
120a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
120b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
120c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
120d0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
120e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
120f0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12100 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
12110 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
12120 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PEN;.  }..  /* I
12130 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
12140 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
12150 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12160 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
12170 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20  e.  ** trusted. 
12180 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61  Now that there a
12190 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
121a0 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
121b0 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20  the pager,.  ** 
121c0 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f  it can safely mo
121d0 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ve back to PAGER
121e0 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69  _OPEN state. Thi
121f0 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74  s happens in bot
12200 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e  h.  ** normal an
12210 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  d exclusive-lock
12220 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing mode..  */. 
12230 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
12240 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Code ){.    asse
12250 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
12260 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
12270 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
12280 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12290 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
122a0 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65  pFile;.    pPage
122b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
122c0 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67  R_OPEN;.    pPag
122d0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
122e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
122f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12300 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
12310 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
12320 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
12330 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aster = 0;.}../*
12340 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12350 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
12360 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72  ever an IOERR or
12370 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74   FULL error that
12380 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65   requires.** the
12390 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69   pager to transi
123a0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52  tion into the ER
123b0 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68  ROR state may ah
123c0 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  ve occurred..** 
123d0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
123e0 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
123f0 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
12400 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
12410 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  nd .** the error
12420 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
12430 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
12440 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
12450 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75  on. The .** valu
12460 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
12470 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
12480 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
12490 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
124a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
124b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
124c0 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
124d0 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
124e0 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20  of the.** IOERR 
124f0 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70  sub-codes, the p
12500 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20  ager enters the 
12510 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
12520 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
12530 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50  * is stored in P
12540 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68  ager.errCode. Wh
12550 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65  ile the pager re
12560 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52  mains in the ERR
12570 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c  OR state,.** all
12580 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73   major API calls
12590 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69   on the Pager wi
125a0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
125b0 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43  eturn Pager.errC
125c0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ode..**.** The E
125d0 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63  RROR state indic
125e0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
125f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12600 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
12610 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
12620 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
12630 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
12640 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
12650 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
12660 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
12670 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
12680 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
12690 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
126a0 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
126b0 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  r occurred, then
126c0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
126d0 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
126e0 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
126f0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
12700 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
12720 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20  s if.** it were 
12730 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
12740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
12750 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
12760 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
12770 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
12780 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
12790 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
127a0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
127b0 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
127c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
127d0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
127e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
127f0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
12800 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
12810 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
12820 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
12830 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32  R.  );.  if( rc2
12840 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12850 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
12860 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  RR ){.    pPager
12870 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
12880 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
12890 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52  te = PAGER_ERROR
128a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
128b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
128c0 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
128d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
128e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
128f0 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12900 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12910 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12920 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12930 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12940 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12950 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
12960 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
12970 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
12980 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
12990 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
129a0 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
129b0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
129c0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
129d0 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
129e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
129f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12a00 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
12a10 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
12a20 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
12a30 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
12a40 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
12a50 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
12a60 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
12a70 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
12a80 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
12a90 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
12aa0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
12ab0 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
12ac0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
12ad0 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
12ae0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
12af0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
12b00 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
12b10 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
12b20 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
12b30 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
12b40 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
12b50 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
12b60 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
12b70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
12b80 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
12b90 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
12ba0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
12bb0 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
12bc0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
12bd0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
12be0 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
12bf0 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
12c00 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
12c10 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
12c20 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12c30 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12c40 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
12c50 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
12c60 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
12c70 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
12c80 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
12c90 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
12ca0 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
12cb0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
12cc0 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
12cd0 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
12ce0 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
12cf0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
12d00 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12d10 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
12d20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
12d30 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
12d40 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
12d50 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
12d60 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
12d70 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
12d80 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
12d90 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12da0 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
12db0 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
12dc0 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
12dd0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12de0 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
12df0 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
12e00 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
12e10 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
12e20 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
12e30 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
12e40 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
12e50 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
12e60 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
12e70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
12e80 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
12e90 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
12ea0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
12eb0 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
12ec0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
12ed0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
12ee0 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
12ef0 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
12f00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12f10 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
12f20 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
12f30 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
12f40 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
12f50 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12f60 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
12f70 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
12f80 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
12f90 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
12fa0 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
12fb0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
12fc0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
12fd0 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
12fe0 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
12ff0 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13000 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13010 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13020 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
13030 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
13040 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
13050 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
13060 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
13070 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
13080 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
13090 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
130a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
130b0 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
130c0 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
130d0 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
130e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
130f0 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
13100 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
13110 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13120 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
13130 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
13140 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
13150 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
13160 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
13170 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
13180 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
13190 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
131a0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
131b0 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
131c0 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
131d0 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
131e0 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
131f0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
13200 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
13210 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13220 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
13230 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
13240 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
13250 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
13260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13270 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
13280 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
13290 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
132a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
132b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
132c0 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
132d0 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
132e0 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
132f0 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
13300 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13310 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13320 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
13330 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
13340 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13350 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
13360 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
13370 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
13380 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
13390 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
133a0 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
133b0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
133c0 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
133d0 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
133e0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
133f0 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
13400 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13410 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
13420 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
13430 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
13440 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13450 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
13460 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
13470 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
13480 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
13490 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
134a0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
134b0 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
134c0 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
134d0 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
134e0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
134f0 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
13500 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
13510 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
13520 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
13530 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
13540 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13550 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
13560 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
13570 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13580 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
13590 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
135a0 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
135b0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
135c0 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
135d0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
135e0 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
135f0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13600 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13610 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13620 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13630 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13640 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13650 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
13660 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
13670 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
13680 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13690 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
136a0 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
136b0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
136c0 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
136d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
136e0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
136f0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13700 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13710 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13720 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13730 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13740 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13760 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
13770 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
13780 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
13790 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
137a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
137b0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
137c0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
137d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
137e0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
137f0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
13800 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13810 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13820 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13830 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
13840 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13850 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
13860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13880 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13890 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
138a0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
138b0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
138c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
138d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
138e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
138f0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13900 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13910 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13920 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13930 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13940 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13950 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
13960 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
13970 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
13980 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
13990 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
139a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
139b0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
139c0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
139d0 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
139e0 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
139f0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13a00 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13a10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13a20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13a30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13a40 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13a50 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
13a60 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
13a70 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
13a80 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
13a90 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
13aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13ab0 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13ac0 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13ad0 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13ae0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13af0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13b00 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13b10 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
13b20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13b30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13b40 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13b50 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
13b60 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
13b70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13b80 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13b90 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
13ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13bb0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13bc0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
13bd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
13be0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13bf0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13c00 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13c10 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13c20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13c30 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13c40 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13c50 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13c60 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13c70 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13c80 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13c90 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13ca0 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13cb0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13cc0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13cd0 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13ce0 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13cf0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13d00 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13d10 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13d20 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13d30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13d50 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13d60 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
13d70 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
13d80 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
13d90 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
13da0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
13db0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
13dc0 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
13dd0 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
13de0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
13df0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
13e00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
13e10 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
13e20 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
13e30 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
13e40 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
13e50 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
13e60 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13e70 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
13e80 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
13e90 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
13ea0 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
13eb0 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
13ec0 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
13ed0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
13ee0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
13ef0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13f00 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
13f10 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
13f20 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
13f30 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
13f40 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   );.  }.  if( !p
13f50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13f60 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
13f70 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13f80 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
13f90 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
13fa0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
13fb0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
13fc0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
13fd0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
13fe0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
13ff0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
14000 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
14010 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
14020 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
14030 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14040 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
14050 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
14060 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
14070 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
14080 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14090 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
140a0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
140b0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
140c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
140d0 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
140e0 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
140f0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14100 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14110 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14120 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14130 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14140 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14150 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14160 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
14170 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
14180 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
14190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
141a0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
141b0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
141c0 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
141d0 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
141e0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
141f0 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14200 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14210 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14220 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14230 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14240 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14250 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
14260 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
14270 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
14280 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
14290 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
142a0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
142b0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
142c0 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
142d0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
142e0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
142f0 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14300 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14310 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14320 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14330 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14340 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14350 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
14360 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
14370 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
14380 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
14390 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
143a0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
143b0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
143c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
143d0 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
143e0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
143f0 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14400 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14410 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14420 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14430 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14440 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
14460 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14480 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
14490 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
144a0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
144b0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
144c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
144d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
144e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
144f0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14500 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14510 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14520 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14530 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
14540 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
14550 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
14560 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
14570 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
14580 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
14590 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
145a0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
145b0 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
145c0 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
145d0 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
145e0 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
145f0 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
14600 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
14610 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
14620 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
14630 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
14640 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
14650 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
14660 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
14670 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
14680 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
14690 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
146a0 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
146b0 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
146c0 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
146d0 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
146e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
146f0 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
14700 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
14710 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
14720 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
14730 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
14740 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
14750 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
14760 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
14770 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
14780 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
14790 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
147a0 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
147b0 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
147c0 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
147d0 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
147e0 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
147f0 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
14800 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
14810 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
14820 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
14830 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
14840 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
14850 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
14860 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
14870 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
14880 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
14890 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
148a0 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
148b0 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
148c0 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
148d0 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
148e0 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
148f0 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
14900 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
14910 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
14920 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
14930 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
14940 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
14950 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
14960 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
14970 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
14980 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
14990 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
149a0 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
149b0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
149c0 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
149d0 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
149e0 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
149f0 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
14a00 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
14a10 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
14a20 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
14a30 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
14a40 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
14a50 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
14a60 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
14a70 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
14a80 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
14a90 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
14aa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14ab0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
14ac0 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
14ad0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
14ae0 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
14af0 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
14b00 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
14b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
14b30 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
14b40 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
14b50 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
14b60 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
14b70 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
14b80 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
14b90 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
14ba0 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
14bb0 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
14bc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14bd0 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
14be0 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
14bf0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
14c00 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
14c10 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
14c20 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
14c30 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
14c40 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
14c50 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
14c60 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
14c70 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
14c80 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
14c90 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
14ca0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
14cb0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
14cc0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
14cd0 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
14ce0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
14cf0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
14d00 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
14d10 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
14d20 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14d30 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14d40 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14d50 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
14d60 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
14d70 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
14d80 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
14d90 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
14da0 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
14db0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
14dc0 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
14dd0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
14de0 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
14df0 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
14e00 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
14e10 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
14e20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
14e30 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
14e40 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
14e50 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
14e60 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
14e70 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
14e80 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
14e90 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
14ea0 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
14eb0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
14ec0 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
14ed0 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
14ee0 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
14ef0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
14f00 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
14f10 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
14f20 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
14f30 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
14f40 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
14f50 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
14f60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14f70 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
14f80 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
14f90 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
14fa0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14fb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
14fc0 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
14fd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14fe0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
14ff0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
15000 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
15010 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
15020 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
15030 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
15040 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
15050 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
15060 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
15070 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
15080 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
15090 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
150a0 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
150b0 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
150c0 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
150d0 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
150e0 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
150f0 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
15100 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
15110 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
15120 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
15130 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
15140 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
15150 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
15160 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
15170 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
15180 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
15190 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
151a0 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
151b0 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
151c0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
151d0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
151e0 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
151f0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
15200 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
15210 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
15220 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
15230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
15240 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
15250 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
15260 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
15270 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
15280 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
15290 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
152a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
152b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
152c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
152d0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
152e0 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
152f0 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
15300 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
15310 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
15320 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
15330 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
15340 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
15350 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
15360 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
15370 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15380 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
15390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
153a0 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
153b0 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
153c0 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
153d0 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
153e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
153f0 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
15400 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
15410 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
15420 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
15430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15440 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
15450 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
15460 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
15490 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
154a0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
154b0 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
154c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
154d0 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
154e0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
154f0 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
15500 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15510 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
15520 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
15530 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
15540 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
15550 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
15560 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
15570 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
15580 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
15590 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
155a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
155b0 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
155c0 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
155d0 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
155e0 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
155f0 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
15600 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
15610 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
15620 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
15630 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
15640 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15650 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
15660 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
15670 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
15680 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
15690 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
156a0 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
156b0 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
156c0 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
156d0 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
156e0 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
156f0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
15700 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
15710 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
15720 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
15730 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
15740 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
15750 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
15760 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
15770 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
15780 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
15790 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65  ) );..  /* Eithe
157a0 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67  r the state is g
157b0 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45  reater than PAGE
157c0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
157d0 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  D (a transaction
157e0 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f   .  ** or savepo
157f0 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e  int rollback don
15800 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74  e at the request
15810 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20   of the caller) 
15820 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20  or this is.  ** 
15830 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15840 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73  llback. If it is
15850 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
15860 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67  ollback, the pag
15870 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74  er.  ** is in st
15880 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c  ate OPEN and hol
15890 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ds an EXCLUSIVE 
158a0 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61  lock. Hot-journa
158b0 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  l rollback.  ** 
158c0 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20  only reads from 
158d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
158e0 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f  , not the sub-jo
158f0 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
15900 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15910 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15920 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
15930 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
15940 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
15950 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  N && pPager->eLo
15960 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15970 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  CK).  );.  asser
15980 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15990 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
159a0 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61  CACHEMOD || isMa
159b0 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20  inJrnl );..  /* 
159c0 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
159d0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
159e0 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
159f0 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
15a00 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
15a10 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
15a20 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
15a30 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
15a40 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
15a50 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
15a60 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
15a70 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
15a80 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
15a90 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
15aa0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
15ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15ac0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
15ad0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
15ae0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
15af0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
15b00 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
15b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15b30 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
15b40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
15b50 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
15b60 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
15b70 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
15b80 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
15b90 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
15ba0 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
15bb0 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
15bc0 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
15bd0 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
15be0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
15bf0 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
15c00 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
15c10 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
15c20 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
15c30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
15c40 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
15c50 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
15c60 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
15c70 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
15c80 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
15c90 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
15ca0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
15cb0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
15cc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15cd0 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
15ce0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15cf0 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
15d00 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
15d10 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
15d20 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
15d30 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
15d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15d50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
15d60 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
15d70 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
15d80 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
15d90 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
15da0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15db0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
15dc0 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
15dd0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
15de0 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75  u8*)aData)!=cksu
15df0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
15e00 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
15e10 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15e20 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20  f this page has 
15e30 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
15e40 79 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75  yed by before du
15e50 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
15e60 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
15e70 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
15e80 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
15e90 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
15ea0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
15eb0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15ec0 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
15ed0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
15ee0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15ef0 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
15f00 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
15f10 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
15f20 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
15f30 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
15f40 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
15f50 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
15f60 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
15f70 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15f80 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
15f90 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
15fa0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
15fb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15fc0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
15fd0 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
15fe0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
15ff0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
16000 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
16010 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
16020 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
16030 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
16040 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
16050 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
16060 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
16070 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
16080 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
16090 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
160a0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
160b0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
160c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
160d0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
160e0 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
160f0 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
16100 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16110 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
16120 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
16130 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16140 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
16150 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
16160 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
16170 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
16180 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
16190 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
161a0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
161b0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
161c0 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
161d0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
161e0 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
161f0 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
16200 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
16210 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
16220 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
16230 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
16240 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
16250 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
16260 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
16270 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
16280 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
16290 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
162a0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
162b0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
162c0 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
162d0 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
162e0 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
162f0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
16300 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
16310 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
16320 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
16330 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
16340 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16350 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
16360 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
16370 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
16380 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
16390 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
163a0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
163b0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
163c0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
163d0 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
163e0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
163f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
16400 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
16410 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
16420 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
16430 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
16440 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
16450 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
16460 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
16470 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
16480 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
16490 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
164a0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
164b0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
164c0 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
164d0 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
164e0 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
164f0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
16500 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
16510 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
16520 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
16530 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
16540 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
16550 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
16560 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
16570 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
16580 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
16590 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
165a0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
165b0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
165c0 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
165d0 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
165e0 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
165f0 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
16600 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
16610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16620 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
16630 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
16640 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
16650 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
16660 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
16670 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
16680 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
16690 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
166a0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
166b0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
166c0 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
166d0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
166e0 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
166f0 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
16700 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
16710 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
16720 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
16730 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
16740 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
16750 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
16760 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
16770 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
16780 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
16790 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
167a0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
167b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
167c0 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
167d0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
167e0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
167f0 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
16800 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
16810 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
16820 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
16830 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
16840 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
16850 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16860 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
16870 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
16880 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
16890 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
168a0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
168b0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
168c0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
168d0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
168e0 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
168f0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
16900 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
16910 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
16920 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
16930 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
16940 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
16950 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
16960 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
16970 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
16980 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
16990 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
169a0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
169b0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
169c0 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
169d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
169e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
169f0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
16a00 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
16a10 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16a20 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
16a30 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
16a40 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
16a50 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
16a60 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
16a70 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
16a80 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
16a90 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
16aa0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
16ab0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
16ac0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
16ad0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16ae0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
16af0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
16b00 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
16b10 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
16b20 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16b30 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
16b40 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
16b50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16b60 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16b70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
16b80 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
16b90 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
16ba0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
16bb0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
16bc0 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
16bd0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
16be0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
16bf0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
16c00 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
16c10 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
16c20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
16c30 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
16c40 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
16c50 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
16c60 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
16c70 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
16c80 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
16c90 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
16ca0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
16cb0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
16cc0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
16cd0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16ce0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
16cf0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
16d00 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
16d10 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
16d20 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
16d30 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
16d40 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
16d50 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
16d60 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
16d70 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16d80 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
16d90 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
16da0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
16db0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16dc0 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
16dd0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
16de0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
16df0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
16e00 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
16e10 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
16e20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
16e30 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
16e40 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
16e50 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
16e60 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
16e70 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16e80 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16e90 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
16ea0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
16eb0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
16ec0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
16ed0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
16ee0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
16ef0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
16f00 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
16f10 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
16f20 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
16f30 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
16f40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16f50 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
16f60 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
16f70 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
16f80 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
16f90 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
16fa0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
16fb0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
16fc0 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
16fd0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
16fe0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
16ff0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
17000 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
17010 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
17020 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17030 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17040 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17050 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17060 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17070 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17080 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17090 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
170a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
170b0 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
170c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
170d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
170e0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
170f0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
17100 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
17110 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
17120 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17130 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17140 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17150 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17160 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17170 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17180 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17190 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
171a0 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
171b0 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
171c0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
171d0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
171e0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
171f0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
17200 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
17210 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
17220 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17230 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17240 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17250 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17260 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17270 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17280 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17290 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
172a0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
172b0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
172c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
172d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
172e0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
172f0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
17300 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
17310 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
17320 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17330 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17340 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17350 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17360 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17370 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17380 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17390 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
173a0 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
173b0 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
173c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
173d0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
173e0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
173f0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
17400 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
17410 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
17420 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17430 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17440 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17450 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17460 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17470 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17480 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17490 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
174a0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
174b0 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
174c0 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
174d0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
174e0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
174f0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
17500 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
17510 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
17520 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17530 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17540 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17550 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17560 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17570 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17580 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17590 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
175a0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
175b0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
175c0 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
175d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
175e0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
175f0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17600 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17610 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17620 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17630 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17640 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17650 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17660 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17670 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17680 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17690 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
176a0 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
176b0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
176c0 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
176d0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
176e0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
176f0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17700 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17710 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17720 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17740 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17750 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17760 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17770 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17780 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17790 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
177a0 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
177b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
177c0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
177d0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
177e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
177f0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17800 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17810 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17820 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17830 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17840 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17850 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17860 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17870 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17880 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17890 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
178a0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
178b0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
178c0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
178d0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
178e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
178f0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17900 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17910 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17920 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17930 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17940 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17950 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
17960 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
17970 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
17980 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
17990 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
179a0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
179b0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
179c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
179d0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
179e0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
179f0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17a00 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17a10 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17a20 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17a30 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17a40 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17a50 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17a60 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17a70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17a80 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17a90 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17aa0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17ab0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17ac0 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17ad0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17ae0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17af0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17b10 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17b20 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17b30 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
17b40 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
17b50 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
17b60 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
17b70 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
17b80 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
17b90 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
17ba0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
17bb0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
17bc0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
17bd0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
17be0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
17bf0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
17c00 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
17c10 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17c20 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
17c30 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
17c40 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
17c50 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
17c60 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
17c70 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
17c80 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
17c90 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
17ca0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
17cb0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
17cc0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
17cd0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
17ce0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
17cf0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
17d00 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
17d10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
17d20 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17d30 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
17d40 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
17d50 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
17d60 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
17d70 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
17d80 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
17d90 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
17da0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
17db0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
17dc0 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
17dd0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
17de0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
17df0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
17e00 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
17e10 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
17e20 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17e30 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
17e40 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
17e50 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
17e60 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
17e70 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
17e80 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
17e90 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
17ea0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
17eb0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
17ec0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
17ed0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
17ee0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
17ef0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
17f00 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
17f10 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
17f20 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
17f30 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
17f40 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
17f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
17f60 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
17f70 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
17f80 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
17f90 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
17fa0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
17fb0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
17fc0 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
17fd0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
17fe0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
17ff0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
18000 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
18010 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
18020 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18030 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18040 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18050 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18060 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18070 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18080 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18090 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
180a0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
180b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
180c0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
180d0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
180e0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
180f0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
18100 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
18110 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
18120 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18130 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18140 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18160 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18170 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18180 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18190 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
181a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
181b0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
181c0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
181d0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
181e0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
181f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18200 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
18210 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
18220 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18230 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18240 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18250 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18260 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18270 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18280 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18290 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
182a0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
182b0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
182c0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
182d0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
182e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
182f0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
18300 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
18310 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18320 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18330 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18340 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18350 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18360 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18370 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18380 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18390 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
183a0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
183b0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
183c0 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
183d0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
183e0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
183f0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
18400 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
18410 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
18420 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18430 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18440 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18450 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18460 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18470 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18480 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18490 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
184a0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
184b0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
184c0 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
184d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
184e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
184f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
18500 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51 4c  flags = .#if SQL
18510 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
18520 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
18530 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61   (pPager->vfsFla
18540 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  gs&SQLITE_OPEN_F
18550 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41  ILEPROTECTION_MA
18560 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20  SK)|.#endif.    
18570 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52    (SQLITE_OPEN_R
18580 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
18590 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
185a0 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
185b0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
185c0 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
185d0 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
185e0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
185f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18600 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
18610 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
18620 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
18630 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
18640 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
18650 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
18660 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
18670 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
18680 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f  ournal.   Also o
18690 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69  btain.  ** suffi
186a0 63 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20  cient space (in 
186b0 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68  zMasterPtr) to h
186c0 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  old the names of
186d0 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75   master.  ** jou
186e0 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61  rnal files extra
186f0 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61  cted from regula
18700 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  r rollback-journ
18710 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  als..  */.  rc =
18720 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
18730 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
18740 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
18750 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18760 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18770 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65  er_out;.  nMaste
18780 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50  rPtr = pVfs->mxP
18790 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61  athname+1;.  zMa
187a0 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  sterJournal = sq
187b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
187c0 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
187d0 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
187e0 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
187f0 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
18800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
18810 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  M;.    goto delm
18820 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20  aster_out;.  }. 
18830 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
18840 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
18850 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b  asterJournal+1];
18860 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18870 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
18880 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
18890 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
188a0 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  al, 0);.  if( rc
188b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
188c0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
188d0 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ;.  zMasterJourn
188e0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
188f0 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72  l] = 0;..  zJour
18900 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
18910 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  rnal;.  while( (
18920 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
18930 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
18940 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
18950 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72  nt exists;.    r
18960 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
18970 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  ess(pVfs, zJourn
18980 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
18990 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
189a0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
189b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
189c0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
189d0 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
189e0 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20   if( exists ){. 
189f0 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
18a00 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
18a10 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
18a20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
18a30 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70  sts..      ** Op
18a40 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
18a50 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
18a60 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18a70 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  al. If.      ** 
18a80 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
18a90 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
18aa0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18ab0 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
18ac0 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
18ad0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23 69   int flags = .#i
18ae0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18af0 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a  DATA_PROTECTION.
18b00 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
18b10 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  >vfsFlags&SQLITE
18b20 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43  _OPEN_FILEPROTEC
18b30 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64  TION_MASK)|.#end
18b40 69 66 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49  if.        (SQLI
18b50 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
18b60 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
18b70 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
18b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18b90 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
18ba0 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
18bb0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
18bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18bd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18be0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18bf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18c00 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
18c10 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
18c20 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
18c30 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
18c40 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
18c50 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
18c60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18c70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18c80 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18ca0 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
18cb0 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
18cc0 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
18cd0 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
18ce0 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
18cf0 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
18d00 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
18d10 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18d20 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
18d30 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18d40 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18d50 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
18d60 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
18d70 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
18d80 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
18d90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18da0 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
18db0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
18dc0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
18dd0 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
18de0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
18df0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
18e00 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
18e10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
18e20 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
18e30 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
18e40 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
18e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18e60 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
18e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
18e80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
18e90 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
18ea0 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
18eb0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
18ec0 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
18ed0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
18ee0 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
18ef0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
18f00 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
18f10 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
18f20 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
18f30 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
18f40 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
18f50 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
18f60 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
18f70 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
18f80 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
18f90 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
18fa0 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
18fb0 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
18fc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
18fd0 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
18fe0 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
18ff0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
19000 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
19010 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
19020 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
19030 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
19040 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
19050 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
19060 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
19070 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
19080 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
19090 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
190a0 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
190b0 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
190c0 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
190d0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
190e0 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
190f0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
19100 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
19110 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
19120 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
19130 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
19140 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
19150 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
19160 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
19170 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
19180 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
19190 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
191a0 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
191b0 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
191c0 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
191d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
191e0 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
191f0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
19200 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
19210 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
19220 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
19230 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
19240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19250 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
19260 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
19270 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
19280 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
19290 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
192a0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
192b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
192c0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
192d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
192e0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
192f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19300 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
19310 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
19320 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
19330 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
19340 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
19350 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
19360 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
19370 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
19380 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
19390 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
193a0 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
193b0 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
193c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
193d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
193e0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
193f0 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
19400 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
19410 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
19420 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
19430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19440 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
19450 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
19460 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
19470 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
19480 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
19490 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
194a0 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
194b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
194c0 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
194d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
194e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
194f0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
19500 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
19510 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72    }else if( (cur
19520 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29  rentSize+szPage)
19530 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  <=newSize ){.   
19540 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
19550 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
19560 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
19570 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
19580 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
19590 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
195a0 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72  -szPage) == curr
195b0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
195c0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
195d0 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20  wSize-szPage) > 
195e0 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
195f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
19600 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
19610 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a  er->fd, pTmp, sz
19620 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a  Page, newSize-sz
19630 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
19640 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19660 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
19670 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
19680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19690 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
196a0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
196b0 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
196c0 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
196d0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
196e0 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
196f0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
19700 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
19710 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
19720 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
19730 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19740 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
19750 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
19760 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
19770 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
19780 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
19790 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
197a0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
197b0 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
197c0 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
197d0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
197e0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
197f0 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
19800 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
19810 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
19820 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
19830 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
19840 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
19850 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
19860 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
19870 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
19880 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
19890 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
198a0 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
198b0 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
198c0 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
198d0 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
198e0 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
198f0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
19900 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
19910 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ZE..**.** If the
19920 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51   file has the SQ
19930 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19940 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70  SAFE_OVERWRITE p
19950 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65  roperty, then se
19960 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69  t.** the effecti
19970 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74  ve sector size t
19980 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61  o its minimum va
19990 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20  lue (512).  The 
199a0 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50  purpose of.** pP
199b0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
199c0 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68   is to define th
199d0 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22  e "blast radius"
199e0 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a   of bytes that.*
199f0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69  * might change i
19a00 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
19a10 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
19a20 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  o a single byte 
19a30 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65  in.** that range
19a40 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45  .  But with POWE
19a50 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
19a60 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75   the blast radiu
19a70 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68  s is zero.** (th
19a80 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52  at is what POWER
19a90 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d  SAFE_OVERWRITE m
19aa0 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e  eans), so we min
19ab0 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72  imize the sector
19ac0 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62  .** size.  For b
19ad0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
19ae0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f  bility of the ro
19af0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66  llback journal f
19b00 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77  ile format,.** w
19b10 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20  e cannot reduce 
19b20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
19b30 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20  ctor size below 
19b40 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
19b50 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
19b60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
19b70 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  {.  assert( isOp
19b80 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
19b90 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
19ba0 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  le );..  if( pPa
19bb0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20  ger->tempFile.  
19bc0 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
19bd0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
19be0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ics(pPager->fd) 
19bf0 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
19c00 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
19c10 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
19c20 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f  E)!=0.  ){.    /
19c30 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f  * Sector size do
19c40 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72  esn't matter for
19c50 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
19c60 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65  . Also, the file
19c70 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20  .    ** may not 
19c80 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
19c90 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63   yet, in which c
19ca0 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72  ase the OsSector
19cb0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61  Size().    ** ca
19cc0 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74  ll will segfault
19cd0 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
19ce0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
19cf0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
19d00 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
19d10 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
19d20 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
19d30 3e 66 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50  >fd);.    if( pP
19d40 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
19d50 3c 33 32 20 29 7b 0a 20 20 20 20 20 20 70 50 61  <32 ){.      pPa
19d60 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
19d70 3d 20 35 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20  = 512;.    }.   
19d80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
19d90 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
19da0 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  OR_SIZE ){.     
19db0 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
19dc0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
19dd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
19de0 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f  ectorSize = MAX_
19df0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20  SECTOR_SIZE;.   
19e00 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19e10 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
19e20 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
19e30 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
19e40 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
19e50 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
19e60 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
19e70 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
19e80 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
19e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
19ea0 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
19eb0 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
19ec0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
19ed0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
19ee0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
19ef0 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
19f00 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
19f10 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
19f20 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
19f30 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
19f40 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
19f50 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
19f60 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
19f70 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
19f80 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
19f90 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
19fa0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
19fb0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
19fc0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
19fd0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
19fe0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
19ff0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
1a000 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
1a010 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
1a020 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
1a030 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1a040 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
1a050 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
1a060 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
1a070 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
1a080 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
1a090 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a0a0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a0b0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1a0c0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
1a0d0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
1a0e0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
1a0f0 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
1a100 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1a110 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1a120 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
1a130 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
1a140 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
1a150 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
1a160 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
1a170 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
1a180 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
1a190 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
1a1a0 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
1a1b0 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
1a1c0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
1a1d0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1a1e0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
1a1f0 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
1a200 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
1a210 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
1a220 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
1a230 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
1a240 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
1a250 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
1a260 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a270 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1a280 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
1a290 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
1a2a0 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
1a2b0 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
1a2c0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
1a2d0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
1a2e0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
1a2f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1a300 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
1a310 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
1a320 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
1a330 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
1a340 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1a350 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
1a360 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
1a370 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
1a380 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1a390 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
1a3a0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
1a3b0 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
1a3c0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1a3d0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
1a3e0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
1a3f0 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
1a400 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
1a410 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
1a420 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
1a430 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
1a440 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
1a450 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
1a460 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1a470 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
1a480 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
1a490 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
1a4a0 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
1a4b0 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
1a4c0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
1a4d0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1a4e0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
1a4f0 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
1a500 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1a510 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
1a520 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
1a530 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
1a540 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
1a550 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
1a560 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
1a570 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
1a580 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
1a590 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
1a5a0 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
1a5b0 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
1a5c0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
1a5d0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
1a5e0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
1a5f0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
1a600 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
1a610 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
1a620 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
1a630 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1a640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a650 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1a660 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1a670 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1a680 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1a690 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1a6a0 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1a6b0 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1a6c0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1a6d0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1a6e0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1a6f0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1a700 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1a710 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1a720 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1a730 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1a740 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1a750 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1a760 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1a770 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1a780 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1a790 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1a7a0 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1a7b0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a7c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1a7d0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1a7e0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1a7f0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1a800 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1a810 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1a820 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1a830 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1a840 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1a850 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1a860 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1a870 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1a880 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1a890 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1a8a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1a8b0 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1a8c0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1a8d0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1a8e0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1a8f0 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1a900 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1a910 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1a920 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1a930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a940 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1a950 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1a960 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1a970 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1a980 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1a990 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1a9a0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a9b0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a9c0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1a9d0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1a9e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a9f0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1aa00 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1aa10 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa30 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1aa40 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1aa50 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1aa60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1aa70 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1aa80 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1aa90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1aaa0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1aab0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1aac0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1aad0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1aae0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1aaf0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1ab00 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1ab10 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1ab20 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1ab30 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1ab40 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1ab50 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1ab60 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1ab70 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1ab80 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1ab90 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1aba0 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1abb0 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
1abc0 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
1abd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
1abe0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
1abf0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
1ac00 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
1ac10 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1ac20 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
1ac30 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1ac40 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1ac50 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
1ac60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ac70 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1ac80 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
1ac90 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
1aca0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
1acb0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
1acc0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
1acd0 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
1ace0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1acf0 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
1ad00 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
1ad10 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
1ad20 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
1ad30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1ad40 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
1ad50 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
1ad60 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
1ad70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1ad80 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
1ad90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
1ada0 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
1adb0 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
1adc0 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
1add0 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
1ade0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
1adf0 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
1ae00 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
1ae10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1ae20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
1ae30 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
1ae40 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
1ae50 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
1ae60 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1ae70 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1ae80 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1ae90 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1aea0 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1aeb0 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1aec0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1aed0 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1aee0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1aef0 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1af00 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1af10 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1af20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1af30 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1af40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1af50 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1af60 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1af70 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1af80 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1af90 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1afa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1afb0 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1afc0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1afd0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1afe0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1aff0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1b000 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1b010 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1b020 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1b030 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1b040 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1b050 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1b060 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1b070 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1b080 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1b090 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1b0a0 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1b0b0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1b0c0 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1b0d0 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1b0e0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1b0f0 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1b100 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1b110 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1b120 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1b130 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1b140 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1b150 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1b160 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1b170 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1b180 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1b190 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1b1a0 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1b1b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1b1c0 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1b1d0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1b1e0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1b1f0 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1b200 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1b210 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b220 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1b230 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1b240 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b250 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1b260 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1b270 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1b280 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1b290 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1b2a0 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1b2b0 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1b2c0 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1b2d0 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1b2e0 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1b2f0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b300 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1b310 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1b320 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1b330 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1b340 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1b350 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1b360 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1b370 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1b380 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1b390 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b3a0 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1b3b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b3c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1b3d0 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1b3e0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1b3f0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1b400 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1b410 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1b420 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1b430 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1b440 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1b450 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1b460 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1b470 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1b480 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1b490 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1b4a0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1b4b0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1b4c0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1b4d0 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1b4e0 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1b4f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1b500 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1b510 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1b520 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1b530 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1b540 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1b550 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1b560 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1b570 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1b580 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1b590 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1b5a0 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1b5b0 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1b5c0 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1b5d0 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1b5e0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1b5f0 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1b600 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1b610 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1b620 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1b630 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1b640 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1b650 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1b660 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1b670 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1b680 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1b690 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1b6a0 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1b6b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1b6c0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b6d0 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1b6e0 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1b6f0 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1b700 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1b710 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1b720 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1b730 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1b740 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1b750 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1b760 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1b770 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b780 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1b790 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1b7a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1b7b0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1b7c0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1b7d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1b7e0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1b7f0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1b800 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1b810 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1b820 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1b830 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b840 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1b850 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1b860 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1b870 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1b880 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1b890 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1b8a0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1b8b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1b8c0 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1b8d0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1b8e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1b8f0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1b900 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1b910 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b920 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1b930 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b950 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b960 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1b970 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1b980 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1b990 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1b9a0 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1b9b0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1b9c0 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1b9d0 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1b9e0 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1b9f0 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1ba00 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1ba10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1ba20 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1ba30 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1ba40 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1ba50 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1ba60 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1ba70 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1ba80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ba90 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1baa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
1bac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1bad0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  E ){.          p
1bae0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1baf0 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1bb00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bb10 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1bb20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1bb30 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1bb40 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1bb50 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1bb60 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1bb70 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1bb80 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1bb90 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1bba0 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1bbb0 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1bbc0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1bbd0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1bbe0 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1bbf0 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1bc00 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1bc10 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1bc20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1bc30 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1bc40 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1bc50 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1bc60 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1bc70 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1bc80 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1bc90 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1bca0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1bcb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bcc0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1bcd0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1bce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bcf0 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1bd00 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1bd10 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1bd20 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1bd30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1bd40 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1bd50 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1bd60 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1bd70 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1bd80 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1bd90 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1bda0 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1bdb0 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1bdc0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1bdd0 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1bde0 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1bdf0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1be00 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1be10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1be20 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1be30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1be40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1be50 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1be60 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1be70 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
1be80 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1be90 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1bea0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1beb0 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1bec0 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1bed0 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1bee0 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1bef0 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1bf00 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1bf10 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1bf20 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1bf30 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1bf40 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1bf50 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1bf60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1bf70 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1bf80 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  d..  */.#ifdef S
1bf90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1bfa0 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
1bfb0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71  ethods ){.    sq
1bfc0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1bfd0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
1bfe0 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1bff0 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a  B_UNCHANGED,0);.
1c000 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1c010 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
1c020 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
1c030 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
1c040 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
1c050 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
1c060 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
1c070 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
1c080 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
1c090 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
1c0a0 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
1c0b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1c0c0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1c0d0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1c0e0 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
1c0f0 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
1c100 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
1c110 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
1c120 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
1c130 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
1c140 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
1c150 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
1c160 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
1c170 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
1c180 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
1c190 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1c1a0 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
1c1b0 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
1c1c0 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
1c1d0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
1c1e0 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
1c1f0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
1c200 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
1c210 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
1c220 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
1c230 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
1c240 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
1c250 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
1c260 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1c270 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1c280 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1c290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c2a0 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
1c2b0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1c2c0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
1c2d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1c2e0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1c2f0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1c300 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1c310 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1c320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1c330 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1c340 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50  ITE_OK.   && (pP
1c350 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1c360 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1c370 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1c380 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
1c390 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
1c3a0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1c3b0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
1c3c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c3d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1c3e0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1c3f0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
1c400 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20  r[0]!='\0');.   
1c410 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1c420 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1c430 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c440 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1c450 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  ] && res ){.    
1c460 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1c470 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1c480 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
1c490 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75  e will return su
1c4a0 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65  ccess,.    ** se
1c4b0 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
1c4c0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
1c4d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1c4e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1c4f0 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
1c500 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  r(pPager, zMaste
1c510 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  r);.    testcase
1c520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c530 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
1c540 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1c550 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
1c560 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
1c570 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
1c580 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
1c590 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
1c5a0 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
1c5b0 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
1c5c0 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
1c5d0 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
1c5e0 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1c5f0 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
1c600 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
1c610 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1c620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1c630 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1c640 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
1c650 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
1c660 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
1c670 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70   into .** pPg->p
1c680 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c  Data. A shared l
1c690 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
1c6a0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  ust be held on t
1c6b0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1c6c0 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20  ile before this 
1c6d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1c6e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67  ed..**.** If pag
1c6f0 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65  e 1 is read, the
1c700 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  n the value of P
1c710 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1c720 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74  ] is set to.** t
1c730 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
1c740 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1c750 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  file..**.** If a
1c760 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1c770 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  s, then the IO e
1c780 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
1c790 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
1c7a0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ** Otherwise, SQ
1c7b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1c7c0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1c7d0 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67  nt readDbPage(Pg
1c7e0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
1c7f0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1c800 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1c810 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1c820 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1c830 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1c840 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1c850 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1c860 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1c870 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1c880 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1c890 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1c8a0 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20    int isInWal = 
1c8b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
1c8c0 2a 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69  * True if page i
1c8d0 73 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f  s in log file */
1c8e0 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1c8f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1c900 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1c910 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1c920 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c930 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1c940 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1c950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1c960 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1c970 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1c980 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
1c990 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65  fd)) ){.    asse
1c9a0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1c9b0 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  File );.    mems
1c9c0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
1c9d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1c9e0 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ze);.    return 
1c9f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1ca00 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
1ca10 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
1ca20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20   /* Try to pull 
1ca30 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1ca40 65 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  e write-ahead lo
1ca50 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1ca60 71 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50  qlite3WalRead(pP
1ca70 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
1ca80 2c 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a  , &isInWal, pgsz
1ca90 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1caa0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1cab0 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57  ITE_OK && !isInW
1cac0 61 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f  al ){.    i64 iO
1cad0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
1cae0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1caf0 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
1cb00 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1cb10 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
1cb20 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66  pData, pgsz, iOf
1cb30 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72  fset);.    if( r
1cb40 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1cb50 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1cb60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1cb70 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
1cb80 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
1cb90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1cba0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65      /* If the re
1cbb0 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66  ad is unsuccessf
1cbc0 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69  ul, set the dbFi
1cbd0 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65  leVers[] to some
1cbe0 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  thing.      ** t
1cbf0 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hat will never b
1cc00 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76  e a valid file v
1cc10 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56  ersion.  dbFileV
1cc20 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a  ers[] is a copy.
1cc30 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65        ** of byte
1cc40 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  s 24..39 of the 
1cc50 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73  database.  Bytes
1cc60 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61   28..31 should a
1cc70 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a  lways be.      *
1cc80 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69  * zero or the si
1cc90 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1cca0 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65  se in page. Byte
1ccb0 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e  s 32..35 and 35.
1ccc0 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f  .39.      ** sho
1ccd0 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62  uld be page numb
1cce0 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65  ers which are ne
1ccf0 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20  ver 0xffffffff. 
1cd00 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20   So filling.    
1cd10 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46    ** pPager->dbF
1cd20 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61  ileVers[] with a
1cd30 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68  ll 0xff bytes sh
1cd40 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20  ould suffice..  
1cd50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
1cd60 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64  For an encrypted
1cd70 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73   database, the s
1cd80 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65  ituation is more
1cd90 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73   complex:  bytes
1cda0 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39  .      ** 24..39
1cdb0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cdc0 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65   are white noise
1cdd0 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61  .  But the proba
1cde0 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20  bility of.      
1cdf0 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67  ** white noising
1ce00 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74   equaling 16 byt
1ce10 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61  es of 0xff is va
1ce20 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1ce30 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73  so.      ** we s
1ce40 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f  hould still be o
1ce50 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
1ce60 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
1ce70 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66  >dbFileVers, 0xf
1ce80 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  f, sizeof(pPager
1ce90 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
1cea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ceb0 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
1cec0 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
1ced0 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20  ata)[24];.      
1cee0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1cef0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1cf00 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70  leVers, sizeof(p
1cf10 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1cf20 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  s));.    }.  }. 
1cf30 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
1cf40 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  pPg->pData, pgno
1cf50 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45  , 3, rc = SQLITE
1cf60 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45  _NOMEM);..  PAGE
1cf70 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1cf80 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
1cf90 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  t);.  PAGER_INCR
1cfa0 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b  (pPager->nRead);
1cfb0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49  .  IOTRACE(("PGI
1cfc0 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1cfd0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41  er, pgno));.  PA
1cfe0 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48  GERTRACE(("FETCH
1cff0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
1d000 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
1d010 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1d020 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
1d030 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1d040 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72  pPg)));..  retur
1d050 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
1d060 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20  pdate the value 
1d070 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  of the change-co
1d080 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73  unter at offsets
1d090 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a   24 and 92 in.**
1d0a0 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
1d0b0 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69  the sqlite versi
1d0c0 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66  on number at off
1d0d0 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68  set 96..**.** Th
1d0e0 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69  is is an uncondi
1d0f0 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20  tional update.  
1d100 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67  See also the pag
1d110 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1d120 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69  unter().** routi
1d130 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70  ne which only up
1d140 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1d150 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20  -counter if the 
1d160 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c  update is actual
1d170 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73  ly.** needed, as
1d180 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1d190 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  he pPager->chang
1d1a0 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65  eCountDone state
1d1b0 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74   variable..*/.st
1d1c0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
1d1d0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
1d1e0 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ter(PgHdr *pPg){
1d1f0 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
1d200 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63  unter;..  /* Inc
1d210 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
1d220 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
1d230 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
1d240 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68  byte 24. */.  ch
1d250 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
1d260 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
1d270 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d  u8*)pPg->pPager-
1d280 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a  >dbFileVers)+1;.
1d290 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1d2a0 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1d2b0 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
1d2c0 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20  er);..  /* Also 
1d2d0 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65  store the SQLite
1d2e0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1d2f0 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20  in bytes 96..99 
1d300 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65  and in.  ** byte
1d310 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74  s 92..95 store t
1d320 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1d330 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1d340 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20  version number. 
1d350 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f   ** is valid. */
1d360 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1d370 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1d380 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +92, change_coun
1d390 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74  ter);.  put32bit
1d3a0 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1d3b0 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45  Data)+96, SQLITE
1d3c0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29  _VERSION_NUMBER)
1d3d0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1d3e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
1d3f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d400 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65   is invoked once
1d410 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74   for each page t
1d420 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1d430 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e  been .** written
1d440 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69   into the log fi
1d450 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72  le when a WAL tr
1d460 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
1d470 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72  led back..** Par
1d480 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68  ameter iPg is th
1d490 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1d4a0 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20   said page. The 
1d4b0 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a  pCtx argument .*
1d4c0 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  * is actually a 
1d4d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1d4e0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a  ager structure..
1d4f0 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50  **.** If page iP
1d500 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20  g is present in 
1d510 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68  the cache, and h
1d520 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1d530 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a  g references,.**
1d540 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64   it is discarded
1d550 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1d560 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72  there are one or
1d570 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e   more outstandin
1d580 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c  g.** references,
1d590 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1d5a0 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72  t is reloaded fr
1d5b0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1d5c0 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d   If the.** attem
1d5d0 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e  pt to reload con
1d5e0 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1d5f0 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72  tabase is requir
1d600 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a  ed and fails, .*
1d610 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  * return an SQLi
1d620 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  te error code. O
1d630 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
1d640 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
1d650 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  nt pagerUndoCall
1d660 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c  back(void *pCtx,
1d670 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e   Pgno iPg){.  in
1d680 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d690 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1d6a0 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74  r = (Pager *)pCt
1d6b0 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  x;.  PgHdr *pPg;
1d6c0 0a 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ..  pPg = sqlite
1d6d0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1d6e0 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1d6f0 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1d700 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1d710 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1d720 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1d730 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1d740 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d750 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
1d760 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
1d770 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d780 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1d790 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
1d7a0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1d7b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1d7c0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  nref(pPg);.    }
1d7d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
1d7e0 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61  lly, if a transa
1d7f0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1d800 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70  back, any backup
1d810 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20   processes are. 
1d820 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64   ** updated as d
1d830 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75  ata is copied ou
1d840 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  t of the rollbac
1d850 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e  k journal and in
1d860 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
1d870 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  base. This is no
1d880 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73  t generally poss
1d890 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20  ible with a WAL 
1d8a0 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a  database, as.  *
1d8b0 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c  * rollback invol
1d8c0 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63  ves simply trunc
1d8d0 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69  ating the log fi
1d8e0 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69  le. Therefore, i
1d8f0 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f  f one.  ** or mo
1d900 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61  re frames have a
1d910 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1d920 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28  ten to the log (
1d930 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20  and therefore . 
1d940 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20   ** also copied 
1d950 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20  into the backup 
1d960 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61  databases) as pa
1d970 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  rt of this trans
1d980 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65  action,.  ** the
1d990 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65   backups must be
1d9a0 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f   restarted..  */
1d9b0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
1d9c0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
1d9d0 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74  pBackup);..  ret
1d9e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d9f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1da00 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
1da10 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1da20 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61  on on a WAL data
1da30 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
1da40 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  int pagerRollbac
1da50 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  kWal(Pager *pPag
1da60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1da90 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72   Code */.  PgHdr
1daa0 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
1dab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1dac0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1dad0 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a  s to revert */..
1dae0 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67    /* For all pag
1daf0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
1db00 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
1db10 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65  ly dirty or have
1db20 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65   already.  ** be
1db30 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20  en written (but 
1db40 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74  not committed) t
1db50 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20  o the log file, 
1db60 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20  do one of the . 
1db70 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20   ** following:. 
1db80 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73   **.  **   + Dis
1db90 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20  card the cached 
1dba0 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e  page (if refcoun
1dbb0 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20  t==0), or.  **  
1dbc0 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63   + Reload page c
1dbd0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1dbe0 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66  database (if ref
1dbf0 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20  count>0)..  */. 
1dc00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1dc10 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
1dc20 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
1dc30 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67  ite3WalUndo(pPag
1dc40 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55  er->pWal, pagerU
1dc50 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  ndoCallback, (vo
1dc60 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20  id *)pPager);.  
1dc70 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1dc80 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1dc90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1dca0 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
1dcb0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1dcc0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1dcd0 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
1dce0 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  irty;.    rc = p
1dcf0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1dd00 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c  ((void *)pPager,
1dd10 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1dd20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
1dd30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1dd40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1dd50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1dd60 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
1dd70 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1dd80 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f  ). As well as lo
1dd90 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  gging.** the con
1dda0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73  tents of the lis
1ddb0 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65  t of pages heade
1ddc0 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e  d by pList (conn
1ddd0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29  ected by pDirty)
1dde0 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1ddf0 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20  on notifies any 
1de00 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72  active backup pr
1de10 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65  ocesses that the
1de20 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63   pages have.** c
1de30 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  hanged. .**.** T
1de40 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1de50 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69   passed into thi
1de60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77  s routine is alw
1de70 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61  ays sorted by pa
1de80 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65  ge number..** He
1de90 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61  nce, if page 1 a
1dea0 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20  ppears anywhere 
1deb0 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20  on the list, it 
1dec0 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73  will be the firs
1ded0 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74  t page..*/ .stat
1dee0 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
1def0 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
1df00 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
1df10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1df20 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
1df30 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1df50 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
1df60 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
1df70 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
1df80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1df90 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
1dfa0 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
1dfb0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1dfe0 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
1dff0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e010 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1e020 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1e030 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  nList;          
1e040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e050 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e060 6e 20 70 4c 69 73 74 20 2a 2f 0a 23 69 66 20 64  n pList */.#if d
1e070 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1e080 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1e090 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1e0a0 45 53 29 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  ES).  PgHdr *p; 
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1e0d0 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65 73 20  ping over pages 
1e0e0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
1e0f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
1e100 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1e110 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53  List );.#ifdef S
1e120 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1e130 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1e140 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e   page list is in
1e150 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
1e160 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73   */.  for(p=pLis
1e170 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74  t; p && p->pDirt
1e180 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  y; p=p->pDirty){
1e190 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1e1a0 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79  pgno < p->pDirty
1e1b0 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65  ->pgno );.  }.#e
1e1c0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1e1d0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
1e1e0 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   || isCommit );.
1e1f0 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29    if( isCommit )
1e200 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41  {.    /* If a WA
1e210 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1e220 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
1e230 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  , there is no po
1e240 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20  int in writing. 
1e250 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20     ** any pages 
1e260 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1e270 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
1e280 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68  Truncate into th
1e290 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20  e WAL file..    
1e2a0 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76  ** They will nev
1e2b0 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e  er be read by an
1e2c0 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d  y client. So rem
1e2d0 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
1e2e0 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20  e pDirty.    ** 
1e2f0 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20  list here. */.  
1e300 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
1e310 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d  PgHdr **ppNext =
1e320 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69   &pList;.    nLi
1e330 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  st = 0;.    for(
1e340 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78  p=pList; (*ppNex
1e350 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e  t = p)!=0; p=p->
1e360 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69  pDirty){.      i
1e370 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75  f( p->pgno<=nTru
1e380 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  ncate ){.       
1e390 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44   ppNext = &p->pD
1e3a0 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c  irty;.        nL
1e3b0 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ist++;.      }. 
1e3c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1e3d0 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73   pList );.  }els
1e3e0 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31  e{.    nList = 1
1e3f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1e400 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
1e410 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74  _WRITE] += nList
1e420 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  ;..  if( pList->
1e430 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
1e440 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
1e450 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63  ter(pList);.  rc
1e460 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61   = sqlite3WalFra
1e470 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  mes(pPager->pWal
1e480 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1e490 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74  >pageSize, pList
1e4a0 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43  , nTruncate, isC
1e4b0 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77  ommit, pPager->w
1e4c0 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b  alSyncFlags.  );
1e4d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e4e0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
1e4f0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
1e500 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
1e510 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1e520 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1e530 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1e540 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1e550 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1e560 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1e570 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1e580 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1e590 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73  AGES.  pList = s
1e5a0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1e5b0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1e5c0 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Cache);.  for(p=
1e5d0 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1e5e0 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65  Dirty){.    page
1e5f0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
1e600 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1e610 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e620 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61  *.** Begin a rea
1e630 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
1e640 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20   the WAL..**.** 
1e650 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1e660 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22  d to be called "
1e670 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
1e680 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20  t()" because it 
1e690 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  essentially.** m
1e6a0 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20  akes a snapshot 
1e6b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e6c0 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1e6d0 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64  oint in time and
1e6e0 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68   preserves.** th
1e6f0 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20  at snapshot for 
1e700 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65  use by the reade
1e710 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f  r in spite of co
1e720 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67  ncurrently chang
1e730 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77  es by.** other w
1e740 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70  riters or checkp
1e750 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
1e760 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69  ic int pagerBegi
1e770 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1e780 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e790 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1e7c0 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
1e7d0 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1e7e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e7f0 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
1e800 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
1e810 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1e820 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
1e830 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1e840 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1e850 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1e860 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
1e870 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  );..  /* sqlite3
1e880 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1e890 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20  ction() was not 
1e8a0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70  called for the p
1e8b0 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61  revious.  ** tra
1e8c0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b  nsaction in lock
1e8d0 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
1e8e0 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20  VE.  So call it 
1e8f0 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  now.  If we.  **
1e900 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   are in locking_
1e910 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20  mode=NORMAL and 
1e920 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72  EndRead() was pr
1e930 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c  eviously called,
1e940 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63  .  ** the duplic
1e950 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d  ate call is harm
1e960 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  less..  */.  sql
1e970 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1e980 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1e990 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pWal);..  rc =
1e9a0 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
1e9b0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1e9c0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63  pPager->pWal, &c
1e9d0 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72  hanged);.  if( r
1e9e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1e9f0 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70  changed ){.    p
1ea00 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1ea10 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
1ea20 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
1ea30 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1ea40 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73  ion is called as
1ea50 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61   part of the tra
1ea60 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47  nsition from PAG
1ea70 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41  ER_OPEN.** to PA
1ea80 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
1ea90 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1eaa0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1eab0 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
1eac0 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e  n pages (assumin
1ead0 67 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  g the page size 
1eae0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1eaf0 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69   in Pager.pageSi
1eb00 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ze)..**.** If no
1eb10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
1eb20 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1eb30 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a  rned and the siz
1eb40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1eb50 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73  e.** in pages is
1eb60 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61   stored in *pnPa
1eb70 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ge. Otherwise, a
1eb80 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65  n error code (pe
1eb90 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  rhaps.** SQLITE_
1eba0 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20  IOERR_FSTAT) is 
1ebb0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e  returned and *pn
1ebc0 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d  Page is left unm
1ebd0 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  odified..*/.stat
1ebe0 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65  ic int pagerPage
1ebf0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
1ec00 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67  ger, Pgno *pnPag
1ec10 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
1ec20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ec30 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
1ec40 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e  o return via *pn
1ec50 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75  Page */..  /* Qu
1ec60 65 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d  ery the WAL sub-
1ec70 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64  system for the d
1ec80 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68  atabase size. Th
1ec90 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20  e WalDbsize().  
1eca0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
1ecb0 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20  rns zero if the 
1ecc0 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  WAL is not open 
1ecd0 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c  (i.e. Pager.pWal
1ece0 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66  ==0), or.  ** if
1ecf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1ed00 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  ze is not availa
1ed10 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73  ble. The databas
1ed20 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20  e size is not.  
1ed30 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ** available fro
1ed40 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  m the WAL sub-sy
1ed50 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20  stem if the log 
1ed60 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72  file is empty or
1ed70 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e  .  ** contains n
1ed80 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65  o valid committe
1ed90 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  d transactions..
1eda0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1edb0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1edc0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
1edd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1ede0 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
1edf0 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73  K );.  nPage = s
1ee00 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28  qlite3WalDbsize(
1ee10 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
1ee20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
1ee30 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 6e 6f  base size was no
1ee40 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
1ee50 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
1ee60 74 65 6d 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d  tem,.  ** determ
1ee70 69 6e 65 20 69 74 20 62 61 73 65 64 20 6f 6e 20  ine it based on 
1ee80 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ee90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1eea0 66 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20  f the size.  ** 
1eeb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1eec0 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 20 69  file is not an i
1eed0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
1eee0 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  of the page-size
1eef0 2c 0a 20 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77  ,.  ** round dow
1ef00 6e 20 74 6f 20 74 68 65 20 6e 65 61 72 65 73 74  n to the nearest
1ef10 20 70 61 67 65 2e 20 45 78 63 65 70 74 2c 20 61   page. Except, a
1ef20 6e 79 20 66 69 6c 65 20 6c 61 72 67 65 72 20 74  ny file larger t
1ef30 68 61 6e 20 30 0a 20 20 2a 2a 20 62 79 74 65 73  han 0.  ** bytes
1ef40 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
1ef50 69 64 65 72 65 64 20 74 6f 20 63 6f 6e 74 61 69  idered to contai
1ef60 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  n at least one p
1ef70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1ef80 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1ef90 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20  i64 n = 0;      
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1efb0 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65   Size of db file
1efc0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1efd0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1efe0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1eff0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1f000 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
1f010 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
1f020 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1f030 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1f040 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
1f050 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1f060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f070 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f090 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
1f0a0 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67  )((n+pPager->pag
1f0b0 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65  eSize-1) / pPage
1f0c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1f0d0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
1f0e0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
1f0f0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
1f100 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
1f110 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
1f120 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
1f130 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
1f140 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
1f150 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
1f160 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
1f170 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
1f180 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
1f190 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
1f1a0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
1f1b0 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
1f1c0 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
1f1d0 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
1f1e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1f1f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f200 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65  IT_WAL./*.** Che
1f210 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
1f220 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
1f230 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
1f240 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
1f250 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
1f260 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1f270 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
1f280 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1f290 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
1f2a0 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
1f2b0 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
1f2c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f2d0 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
1f2e0 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
1f2f0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
1f300 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
1f310 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
1f320 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
1f330 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
1f340 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
1f350 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
1f360 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
1f370 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
1f380 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
1f390 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
1f3a0 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
1f3b0 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
1f3c0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
1f3d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1f3e0 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
1f3f0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
1f400 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
1f410 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
1f420 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1f430 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
1f440 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
1f450 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
1f460 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1f470 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
1f480 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
1f490 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
1f4a0 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
1f4b0 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
1f4c0 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
1f4d0 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
1f4e0 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
1f4f0 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
1f500 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
1f510 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
1f520 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
1f530 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
1f540 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
1f550 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
1f560 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1f570 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f580 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1f590 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1f5a0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
1f5b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1f5c0 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
1f5d0 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
1f5e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1f5f0 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
1f620 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
1f630 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f650 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1f660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f670 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
1f680 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1f690 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
1f6a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f6b0 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
1f6c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1f6d0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1f6e0 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
1f6f0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
1f700 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20  ;.      isWal = 
1f710 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1f720 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f730 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
1f740 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
1f750 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1f760 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1f770 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
1f780 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1f790 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f7a0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1f7b0 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
1f7c0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1f7d0 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
1f7e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f7f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1f800 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f810 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
1f820 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
1f830 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1f840 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1f850 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
1f860 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1f870 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
1f880 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1f890 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
1f8a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1f8b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1f8c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
1f8d0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
1f8e0 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
1f8f0 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
1f900 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
1f910 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
1f920 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f930 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
1f940 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
1f950 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
1f960 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
1f970 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
1f980 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
1f990 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
1f9a0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
1f9b0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
1f9c0 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
1f9d0 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
1f9e0 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
1f9f0 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
1fa00 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
1fa10 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
1fa20 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
1fa30 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
1fa40 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
1fa50 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
1fa60 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
1fa70 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
1fa80 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1fa90 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1faa0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
1fab0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
1fac0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1fad0 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
1fae0 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
1faf0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1fb00 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
1fb10 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1fb20 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
1fb30 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
1fb40 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1fb50 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
1fb60 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
1fb70 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1fb80 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
1fb90 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
1fba0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
1fbb0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
1fbc0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1fbd0 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
1fbe0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
1fbf0 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
1fc00 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
1fc10 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1fc20 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
1fc30 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
1fc40 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
1fc50 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1fc60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
1fc70 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
1fc80 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
1fc90 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
1fca0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
1fcb0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
1fcc0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
1fcd0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
1fce0 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
1fcf0 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
1fd00 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
1fd10 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
1fd20 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
1fd30 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
1fd40 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
1fd50 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
1fd60 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
1fd70 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1fd80 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
1fd90 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
1fda0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
1fdb0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
1fdc0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
1fdd0 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
1fde0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
1fdf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1fe00 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
1fe10 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
1fe20 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
1fe30 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
1fe40 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
1fe50 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
1fe60 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
1fe70 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1fe80 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
1fe90 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
1fea0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
1feb0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
1fec0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
1fed0 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
1fee0 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
1fef0 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1ff00 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
1ff10 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
1ff20 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
1ff30 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
1ff40 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
1ff50 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
1ff60 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
1ff70 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
1ff80 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
1ff90 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
1ffa0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
1ffb0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
1ffc0 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
1ffd0 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
1ffe0 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20000 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
20010 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
20020 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
20030 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
20040 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
20050 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
20060 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
20070 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
20080 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
20090 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
200a0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
200b0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
200c0 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
200d0 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
200e0 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
200f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
20100 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
20110 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
20120 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20130 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
20140 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
20150 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
20160 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
20170 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
20180 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
20190 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
201a0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
201b0 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
201c0 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
201d0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
201e0 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
201f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20200 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
20210 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
20220 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20230 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
20240 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
20250 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
20260 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
20270 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
20280 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
20290 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
202a0 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
202b0 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
202c0 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
202d0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
202e0 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
202f0 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
20300 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
20310 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20320 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
20330 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
20340 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
20350 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
20360 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
20370 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
20380 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
20390 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
203a0 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
203b0 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
203c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
203d0 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
203e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
203f0 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
20400 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
20410 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
20420 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
20430 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
20440 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
20450 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
20460 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20470 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
20480 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20490 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
204a0 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
204b0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
204c0 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
204d0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
204e0 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
204f0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
20500 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
20510 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
20520 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
20530 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
20540 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
20550 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
20560 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
20570 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
20580 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
20590 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
205a0 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
205b0 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
205c0 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
205d0 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
205e0 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
205f0 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
20600 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
20610 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
20620 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
20630 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
20640 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
20650 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
20660 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
20670 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
20680 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
20690 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
206a0 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
206b0 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
206c0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
206d0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
206e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
206f0 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
20700 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20710 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20720 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
20730 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
20740 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20750 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20760 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
20770 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
20780 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
20790 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
207a0 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
207b0 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
207c0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
207d0 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
207e0 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
207f0 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
20800 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
20810 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
20820 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
20830 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
20840 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
20850 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
20860 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
20870 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
20880 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
20890 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
208a0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
208b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
208c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
208d0 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
208e0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
208f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20900 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
20910 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
20920 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
20930 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
20940 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
20950 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
20960 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
20970 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
20980 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
20990 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
209a0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
209b0 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
209c0 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
209d0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
209e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
209f0 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
20a00 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
20a10 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
20a20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
20a30 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
20a40 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
20a50 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
20a60 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
20a70 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
20a80 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
20a90 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
20aa0 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
20ab0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
20ac0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20ad0 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
20ae0 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
20af0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
20b00 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
20b10 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
20b20 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
20b30 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
20b40 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
20b50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20b60 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
20b70 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20b80 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
20b90 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
20ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
20bb0 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
20bc0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20bd0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
20be0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
20bf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
20c00 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
20c10 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
20c20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
20c30 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
20c40 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
20c50 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
20c60 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
20c70 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
20c80 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
20c90 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
20ca0 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
20cb0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
20cc0 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
20cd0 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
20ce0 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
20cf0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
20d00 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
20d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20d20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20d30 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
20d40 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e  i64)pSavepoint->
20d50 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
20d60 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
20d70 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
20d80 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20d90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20da0 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f  WalSavepointUndo
20db0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
20dc0 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44  Savepoint->aWalD
20dd0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
20de0 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e  for(ii=pSavepoin
20df0 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d  t->iSubRec; rc==
20e00 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
20e10 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
20e20 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
20e30 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69  sert( offset==(i
20e40 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  64)ii*(4+pPager-
20e50 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
20e60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
20e70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
20e80 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74  (pPager, &offset
20e90 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a  , pDone, 0, 1);.
20ea0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
20ec0 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
20ed0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
20ee0 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
20ef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20f00 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
20f10 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
20f20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
20f30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
20f40 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
20f50 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
20f60 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
20f70 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
20f80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
20f90 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
20fa0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
20fb0 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  ge){.  sqlite3Pc
20fc0 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65  acheSetCachesize
20fd0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
20fe0 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
20ff0 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68  .** Free as much
21000 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
21010 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ble from the pag
21020 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
21030 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50  te3PagerShrink(P
21040 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21050 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
21060 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43  rink(pPager->pPC
21070 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
21080 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
21090 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
210a0 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
210b0 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
210c0 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
210d0 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
210e0 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
210f0 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
21100 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
21110 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
21120 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
21130 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
21140 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
21150 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
21160 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
21170 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
21180 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
21190 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
211a0 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
211b0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
211c0 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
211d0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
211e0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
211f0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
21210 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
21220 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
21230 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
21240 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
21250 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
21260 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
21270 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
21280 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
21290 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
212a0 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
212b0 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
212c0 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
212d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
212e0 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
212f0 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
21300 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
21310 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
21320 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
21330 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
21340 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
21350 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
21360 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
21370 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
21380 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
21390 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
213a0 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
213b0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
213c0 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
213d0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
213e0 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
213f0 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
21400 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
21410 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
21420 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
21430 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
21440 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
21450 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21460 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
21470 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
21480 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
21490 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
214a0 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
214b0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
214c0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
214d0 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
214f0 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
21500 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
21510 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
21520 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lback..**.** The
21530 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
21540 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
21550 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
21560 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
21570 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
21580 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
21590 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
215a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
215b0 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
215c0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
215d0 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
215e0 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
215f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
21600 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
21610 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
21620 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
21630 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
21640 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
21650 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
21660 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
21670 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
21680 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
21690 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
216a0 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
216b0 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
216c0 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
216d0 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
216e0 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
216f0 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
21700 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
21710 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
21720 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
21730 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
21740 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  ORMAL..**.** Do 
21750 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
21760 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
21770 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
21780 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
21790 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
217a0 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
217b0 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
217c0 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
217d0 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
217e0 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
217f0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
21800 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
21810 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
21820 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
21830 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
21840 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
21850 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
21860 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
21870 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
21880 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
21890 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
218a0 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
218b0 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
218c0 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
218d0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
218e0 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
218f0 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
21900 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
21910 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
21920 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
21930 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
21940 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
21950 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
21960 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
21970 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
21980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21990 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
219a0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
219b0 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 0a  SetSafetyLevel(.
219c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
219d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
219e0 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65  ager to set safe
219f0 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a  ty level for */.
21a00 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20    int level,    
21a10 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d          /* PRAGM
21a20 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20  A synchronous.  
21a30 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c  1=OFF, 2=NORMAL,
21a40 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a 20 20 69   3=FULL */  .  i
21a50 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 2c 20 20  nt bFullFsync,  
21a60 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66       /* PRAGMA f
21a70 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20 20 69 6e  ullfsync */.  in
21a80 74 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63  t bCkptFullFsync
21a90 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 63 68      /* PRAGMA ch
21aa0 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79  eckpoint_fullfsy
21ab0 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  nc */.){.  asser
21ac0 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c  t( level>=1 && l
21ad0 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61  evel<=3 );.  pPa
21ae0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
21af0 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
21b00 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
21b10 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
21b20 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
21b30 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
21b40 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
21b50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
21b60 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
21b70 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30  r->syncFlags = 0
21b80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
21b90 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ptSyncFlags = 0;
21ba0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 46 75  .  }else if( bFu
21bb0 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
21bc0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21bd0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21be0 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ULL;.    pPager-
21bf0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
21c00 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
21c10 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  L;.  }else if( b
21c20 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 29 7b  CkptFullFsync ){
21c30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21c40 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
21c50 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
21c60 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
21c70 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
21c80 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
21c90 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
21ca0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
21cb0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
21cc0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
21cd0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
21ce0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
21cf0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61    }.  pPager->wa
21d00 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61  lSyncFlags = pPa
21d10 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
21d20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
21d30 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
21d40 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
21d50 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54  gs |= WAL_SYNC_T
21d60 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d  RANSACTIONS;.  }
21d70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21d80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
21d90 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
21da0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
21db0 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
21dc0 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
21dd0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
21de0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
21df0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
21e00 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
21e10 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
21e20 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
21e30 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
21e40 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
21e50 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
21e60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
21e70 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
21e80 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
21e90 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
21ea0 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
21eb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
21ec0 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
21ed0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
21ee0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
21ef0 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
21f00 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
21f10 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
21f20 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
21f30 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
21f40 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
21f50 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
21f60 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
21f70 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
21f80 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
21f90 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
21fa0 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
21fb0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
21fc0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
21fd0 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
21fe0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
21ff0 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
22000 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
22010 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22020 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
22030 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
22040 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
22050 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22070 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
22080 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
22090 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
220a0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
220b0 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
220c0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
220d0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
220e0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
220f0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
22100 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22110 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22120 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
22130 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
22140 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
22150 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
22160 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
22170 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
22180 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
22190 67 73 20 7c 3d 20 20 0a 23 69 66 20 53 51 4c 49  gs |=  .#if SQLI
221a0 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
221b0 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20  ROTECTION.      
221c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76        (pPager->v
221d0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
221e0 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49  PEN_FILEPROTECTI
221f0 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66  ON_MASK)|.#endif
22200 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
22210 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22220 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
22230 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
22240 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
22250 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
22260 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
22270 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
22280 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
22290 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
222a0 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
222b0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
222c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
222d0 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
222e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
222f0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
22300 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
22310 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
22320 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
22330 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
22340 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
22350 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
22360 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
22370 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
22380 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
22390 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
223a0 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
223b0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
223c0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
223d0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
223e0 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
223f0 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
22400 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
22410 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
22420 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
22430 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
22440 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
22450 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
22460 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
22470 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
22480 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
22490 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
224a0 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
224b0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
224c0 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
224d0 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
224e0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
224f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
22520 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
22530 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
22540 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
22550 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
22560 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
22570 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
22580 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
22590 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
225a0 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
225b0 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
225c0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
225d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
225e0 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
225f0 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
22600 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
22610 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
22620 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
22630 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
22640 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
22650 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
22660 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
22670 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
22680 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
22690 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
226a0 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
226b0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226d0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
226e0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
226f0 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
22700 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
22710 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
22720 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
22730 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
22740 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
22750 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
22760 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
22770 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
22780 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  {  .  pPager->xB
22790 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
227a0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
227b0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
227c0 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
227d0 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lerArg;.}../*.**
227e0 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
227f0 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
22800 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
22810 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
22820 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
22830 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
22840 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
22850 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
22860 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
22870 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22880 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
22890 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
228a0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
228b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
228c0 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
228d0 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
228e0 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
228f0 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
22900 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
22910 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
22920 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
22930 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
22940 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
22950 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
22960 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
22970 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
22980 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
22990 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
229a0 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
229b0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
229c0 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
229d0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
229e0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
229f0 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
22a00 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
22a10 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
22a20 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
22a30 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
22a40 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
22a50 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
22a60 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
22a70 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
22a80 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
22a90 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
22aa0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
22ab0 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
22ac0 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
22ad0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
22ae0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
22af0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
22b00 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
22b10 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
22b20 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
22b30 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
22b40 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
22b50 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
22b60 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
22b70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
22b80 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
22b90 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
22ba0 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
22bb0 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
22bc0 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
22bd0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
22be0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
22bf0 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
22c00 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
22c10 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
22c20 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
22c30 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
22c40 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
22c50 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
22c60 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
22c70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
22c80 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
22c90 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
22ca0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
22cb0 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
22cc0 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
22cd0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
22ce0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
22cf0 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
22d00 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
22d10 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
22d20 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
22d30 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
22d40 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
22d50 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
22d60 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
22d70 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
22d80 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
22d90 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
22da0 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
22db0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
22dc0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
22dd0 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
22de0 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
22df0 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
22e00 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
22e10 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
22e20 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
22e30 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
22e40 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
22e50 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
22e60 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
22e70 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
22e80 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
22e90 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
22ea0 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
22eb0 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
22ec0 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
22ed0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
22ee0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
22ef0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
22f00 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
22f10 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
22f20 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
22f30 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
22f40 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
22f50 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
22f60 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
22f70 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
22f80 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
22f90 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
22fa0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
22fb0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
22fc0 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
22fd0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
22fe0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22ff0 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
23000 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
23010 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
23020 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
23030 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
23040 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
23050 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
23060 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
23070 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
23080 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
23090 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
230a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
230b0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
230c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
230d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
230e0 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
230f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23100 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
23110 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
23120 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
23130 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
23140 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
23150 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
23160 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
23170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23180 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
23190 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50  Pager);.      pP
231a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
231b0 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
231c0 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
231d0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
231e0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
231f0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c  eSize;.      sql
23200 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
23210 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
23220 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
23230 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
23240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
23250 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
23260 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
23270 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
23280 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53  }.  }..  *pPageS
23290 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
232a0 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63  geSize;.  if( rc
232b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
232c0 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c     if( nReserve<
232d0 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70  0 ) nReserve = p
232e0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b  Pager->nReserve;
232f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65  .    assert( nRe
23300 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73  serve>=0 && nRes
23310 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20  erve<1000 );.   
23320 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
23330 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76  e = (i16)nReserv
23340 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
23350 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
23360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
23380 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
23390 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
233a0 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
233b0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
233c0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
233d0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
233e0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
233f0 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
23400 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
23410 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
23420 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
23430 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
23440 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
23450 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
23460 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
23470 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
23480 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
23490 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
234a0 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
234b0 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
234c0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
234d0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
234e0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
234f0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
23500 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23510 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
23520 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
23530 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
23540 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
23550 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
23560 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
23570 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
23580 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
23590 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
235a0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
235b0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
235c0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
235d0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
235e0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
235f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23600 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
23610 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
23620 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
23630 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
23640 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
23650 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
23660 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
23670 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
23680 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
23690 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
236a0 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
236b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
236c0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
236d0 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
236e0 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
236f0 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
23700 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
23710 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
23720 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
23730 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
23740 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
23750 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
23760 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
23770 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
23780 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
23790 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
237a0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
237b0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
237c0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
237d0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
237e0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
237f0 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
23800 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
23810 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
23820 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
23830 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
23840 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
23850 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
23860 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
23870 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
23880 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
23890 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
238a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
238b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
238c0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
238d0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
238e0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
238f0 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
23900 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
23910 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
23920 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
23930 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
23940 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
23950 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
23960 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
23970 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
23980 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
23990 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
239a0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
239b0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
239c0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
239d0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
239e0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
239f0 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
23a00 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
23a10 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
23a20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
23a30 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
23a40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
23a50 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
23a60 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
23a70 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
23a80 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
23a90 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
23aa0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
23ab0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
23ac0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
23ad0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
23ae0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
23af0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
23b00 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
23b10 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
23b20 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
23b30 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
23b40 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
23b50 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
23b60 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
23b70 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
23b80 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
23b90 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
23ba0 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
23bb0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
23bc0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
23bd0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
23be0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
23bf0 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
23c00 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
23c10 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
23c20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
23c30 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
23c40 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
23c50 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
23c60 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
23c70 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
23c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23c90 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
23ca0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
23cb0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
23cc0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
23cd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23ce0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
23cf0 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
23d00 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
23d10 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
23d20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
23d30 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
23d40 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
23d50 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
23d60 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
23d70 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
23d80 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
23d90 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
23da0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
23db0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
23dc0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
23dd0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
23de0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
23df0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
23e00 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
23e10 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
23e20 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
23e30 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
23e40 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
23e50 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
23e60 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
23e70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
23e80 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
23e90 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
23ea0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
23eb0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
23ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23ed0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23ee0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
23ef0 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
23f00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
23f10 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
23f20 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
23f30 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
23f40 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
23f50 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
23f60 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
23f70 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
23f80 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
23f90 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
23fa0 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
23fb0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
23fc0 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
23fd0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
23fe0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
23ff0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
24000 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
24010 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24020 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
24030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
24040 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
24050 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
24060 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
24070 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
24080 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
24090 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
240a0 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
240b0 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
240c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
240d0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
240e0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
240f0 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
24100 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
24110 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
24120 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
24130 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
24140 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
24150 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
24160 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
24170 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
24180 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
24190 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
241a0 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
241b0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
241c0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
241d0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
241e0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
241f0 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
24200 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
24210 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
24220 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
24230 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24240 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
24250 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
24260 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
24270 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
24280 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
24290 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
242a0 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
242b0 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
242c0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
242d0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
242e0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
242f0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
24300 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
24310 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
24320 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
24330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
24350 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
24360 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
24370 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
24380 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
24390 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
243a0 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
243b0 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
243c0 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
243d0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
243e0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
243f0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
24400 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
24410 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
24420 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
24430 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
24440 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
24450 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
24460 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
24470 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
24480 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
24490 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
244a0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
244b0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
244c0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
244d0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
244e0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
244f0 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
24500 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
24510 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
24520 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
24530 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
24540 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
24550 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
24560 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
24570 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
24580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
24590 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
245a0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
245b0 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
245c0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
245d0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
245e0 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
245f0 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
24600 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
24610 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
24620 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
24630 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
24640 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
24650 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
24660 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
24670 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
24680 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
24690 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
246a0 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
246b0 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
246c0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
246d0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
246e0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
246f0 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
24700 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
24710 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
24720 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
24730 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
24740 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
24750 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
24760 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
24770 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
24780 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
24790 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
247a0 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
247b0 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
247c0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
247d0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
247e0 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
247f0 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
24800 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
24810 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
24820 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
24830 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
24840 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
24850 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
24860 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
24870 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
24880 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75  correct behaviou
24890 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
248a0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
248b0 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
248c0 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
248d0 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
248e0 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
248f0 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
24900 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
24910 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
24920 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
24930 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
24940 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
24950 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
24960 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
24970 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
24980 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
24990 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
249a0 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
249b0 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
249c0 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
249d0 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
249e0 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
249f0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
24a00 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
24a10 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
24a20 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
24a30 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
24a40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
24a50 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
24a60 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
24a70 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
24a80 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
24a90 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
24aa0 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
24ab0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
24ac0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
24ad0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
24ae0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
24af0 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
24b00 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
24b10 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
24b20 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
24b30 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
24b40 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
24b50 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
24b60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
24b70 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
24b80 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
24b90 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
24ba0 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
24bb0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
24bc0 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
24bd0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
24be0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
24bf0 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
24c00 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
24c10 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
24c20 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
24c30 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
24c40 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
24c50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
24c60 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
24c70 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  mitted..*/.void 
24c80 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
24c90 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
24ca0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
24cb0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
24cc0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
24cd0 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
24ce0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24cf0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
24d00 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
24d10 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
24d20 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72  Page;.  assertTr
24d30 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
24d40 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
24d50 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24d60 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
24d70 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
24d80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
24d90 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
24da0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
24db0 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
24dc0 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
24dd0 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
24de0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
24df0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
24e00 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
24e10 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
24e20 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
24e30 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
24e40 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
24e50 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
24e60 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
24e70 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
24e80 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
24e90 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
24ea0 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
24eb0 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
24ec0 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
24ed0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
24ee0 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
24ef0 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
24f00 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
24f10 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
24f20 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
24f30 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
24f40 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
24f50 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
24f60 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
24f70 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
24f80 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
24f90 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
24fa0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
24fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
24fc0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
24fd0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
24fe0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24ff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
25000 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
25010 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
25020 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
25030 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
25040 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
25050 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25060 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
25070 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
25080 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
25090 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
250a0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
250b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
250c0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
250d0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
250e0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
250f0 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
25100 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
25110 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
25120 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
25130 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
25140 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
25150 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
25160 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
25170 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
25180 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
25190 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
251a0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
251b0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
251c0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
251d0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
251e0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
251f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
25200 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
25210 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
25220 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
25230 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
25240 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
25250 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
25260 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
25270 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
25280 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
25290 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
252a0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
252b0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
252c0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
252d0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
252e0 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
252f0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
25300 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
25310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25320 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
25330 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
25340 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
25350 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
25360 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
25370 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
25380 50 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61  Pager) );.  disa
25390 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
253a0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
253b0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
253c0 61 6c 6c 6f 63 28 29 3b 0a 20 20 2f 2a 20 70 50  alloc();.  /* pP
253d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
253e0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
253f0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
25400 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
25410 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
25420 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
25430 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
25440 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
25450 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
25460 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
25470 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
25480 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
25490 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
254a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
254b0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
254c0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
254d0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
254e0 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
254f0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
25500 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
25510 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
25520 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
25530 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
25540 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
25550 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
25560 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
25570 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
25580 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
25590 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
255a0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
255b0 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
255c0 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
255d0 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
255e0 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
255f0 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
25600 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
25610 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
25620 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
25630 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
25640 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
25650 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
25660 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
25670 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
25680 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
25690 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
256a0 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
256b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
256c0 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
256d0 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
256e0 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
256f0 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
25700 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
25710 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
25720 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
25730 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
25740 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
25750 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
25760 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
25770 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
25780 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
25790 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
257a0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
257b0 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
257c0 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
257d0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
257e0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
257f0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
25800 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
25810 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
25820 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
25830 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
25840 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
25850 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
25860 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
25870 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
25880 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
25890 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
258a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
258b0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
258c0 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
258d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
258e0 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
258f0 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
25900 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
25910 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
25920 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
25930 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
25940 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
25950 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
25960 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
25970 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
25980 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
25990 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
259a0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
259b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
259c0 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
259d0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
259e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
259f0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
25a00 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
25a10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
25a20 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
25a30 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
25a40 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
25a50 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
25a60 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
25a70 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
25a80 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
25a90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
25aa0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
25ab0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
25ac0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
25ad0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25ae0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
25af0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
25b00 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
25b10 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
25b20 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
25b30 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
25b40 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
25b50 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
25b60 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
25b70 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
25b80 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
25b90 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
25ba0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
25bb0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
25bc0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
25bd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
25be0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
25bf0 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
25c00 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
25c10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25c20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
25c30 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
25c40 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
25c50 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
25c60 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
25c70 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
25c80 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
25c90 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  he the file-syst
25ca0 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
25cb0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
25cc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
25cd0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
25ce0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
25cf0 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
25d00 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
25d10 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
25d20 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
25d30 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
25d40 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
25d50 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
25d60 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
25d70 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
25d80 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
25d90 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
25da0 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
25db0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
25dc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
25dd0 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
25de0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
25df0 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
25e00 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
25e10 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
25e20 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
25e30 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
25e40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25e50 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
25e60 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
25e70 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
25e80 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
25e90 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
25ea0 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
25eb0 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
25ec0 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
25ed0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
25ee0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
25ef0 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
25f00 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
25f10 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
25f20 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
25f30 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
25f40 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
25f50 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
25f60 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
25f70 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
25f80 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
25f90 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
25fa0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
25fb0 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
25fc0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
25fd0 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66  .**   }.**.** If
25fe0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
25ff0 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
26000 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
26010 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65  SYNC flag of eve
26020 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72  ry .** page curr
26030 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65  ently held in me
26040 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75  mory before retu
26050 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e  rning SQLITE_OK.
26060 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72   If an IO.** err
26070 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
26080 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  d, then the IO e
26090 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
260a0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
260b0 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
260c0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
260d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
260e0 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74  t newHdr){.  int
260f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
26100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26110 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
26120 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26130 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
26140 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
26150 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
26160 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
26170 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29  WRITER_DBMOD.  )
26180 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
26190 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
261a0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
261b0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
261c0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72  (pPager) );..  r
261d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
261e0 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50  ExclusiveLock(pP
261f0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
26200 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
26210 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21  urn rc;..  if( !
26220 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
26230 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
26240 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
26250 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  );.    if( isOpe
26260 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
26270 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
26280 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
26290 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
262a0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  ){.      const i
262b0 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
262c0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
262d0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
262e0 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fd);.      asser
262f0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
26300 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20  ->jfd) );..     
26310 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
26320 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
26330 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
26340 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
26350 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62  deals with an ob
26360 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49  scure problem. I
26370 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65  f the last conne
26380 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ction.        **
26390 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74   that wrote to t
263a0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73  his database was
263b0 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65   operating in pe
263c0 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  rsistent-journal
263d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  .        ** mode
263e0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
263f0 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74  al file may at t
26400 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c  his point actual
26410 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20  ly be larger.   
26420 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67       ** than Pag
26430 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79  er.journalOff by
26440 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74  tes. If the next
26450 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f   thing in the jo
26460 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
26470 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f   file happens to
26480 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   be a journal-he
26490 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73  ader (written as
264a0 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20   part of the.   
264b0 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
264c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72   connection's tr
264d0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20  ansaction), and 
264e0 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  a crash or power
264f0 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20  -failure .      
26500 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65    ** occurs afte
26510 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  r nRec is update
26520 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68 69  d but before thi
26530 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
26540 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  tes .        ** 
26550 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f  anything else to
26560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26570 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f  e (or commits/ro
26580 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20  lls back its .  
26590 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
265a0 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69  tion), then SQLi
265b0 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f  te may become co
265c0 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e  nfused when doin
265d0 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  g the .        *
265e0 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * hot-journal ro
265f0 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67  llback following
26600 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61   recovery. It ma
26610 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a  y roll back all.
26620 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
26630 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64  is connections d
26640 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65  ata, then procee
26650 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63  d to rolling bac
26660 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20  k the old,.     
26670 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74     ** out-of-dat
26680 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
26690 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73 65  ows it. Database
266a0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
266b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
266c0 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
266d0 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a  d this, if the j
266e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
266f0 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61   appear to conta
26700 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  in.        ** a 
26710 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c  valid header fol
26720 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75  lowing Pager.jou
26730 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72  rnalOff, then wr
26740 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20 20  ite a 0x00.     
26750 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68     ** byte to th
26760 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f  e start of it to
26770 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d   prevent it from
26780 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65   being recognize
26790 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  d..        **.  
267a0 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c        ** Variabl
267b0 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  e iNextHdrOffset
267c0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
267d0 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20 74  ffset at which t
267e0 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  his.        ** p
267f0 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65  roblematic heade
26800 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66  r will occur, if
26810 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67   it exists. aMag
26820 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20 20  ic is used .    
26830 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70      ** as a temp
26840 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20  orary buffer to 
26850 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72 73  inspect the firs
26860 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65  t couple of byte
26870 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  s of.        ** 
26880 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f  the potential jo
26890 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
268a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
268b0 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66   i64 iNextHdrOff
268c0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20  set;.        u8 
268d0 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20  aMagic[8];.     
268e0 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69     u8 zHeader[si
268f0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
26900 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20  ic)+4];..       
26910 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
26920 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
26930 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
26940 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
26950 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
26960 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
26970 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65  alMagic)], pPage
26980 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
26990 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65     iNextHdrOffse
269a0 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
269b0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
269c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
269d0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
269e0 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
269f0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
26a00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
26a20 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
26a30 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
26a40 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
26a50 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
26a60 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
26a70 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26a80 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
26a90 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
26aa0 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
26ab0 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
26ac0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
26ad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
26ae0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
26af0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
26b00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
26b10 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
26b20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
26b30 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
26b40 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
26b50 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
26b60 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
26b70 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
26b80 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
26b90 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
26ba0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
26bb0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
26bc0 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
26bd0 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
26be0 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
26bf0 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
26c00 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
26c10 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
26c20 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
26c30 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
26c40 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
26c50 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
26c60 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
26c70 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
26c80 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
26c90 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
26ca0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
26cb0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
26cc0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
26cd0 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
26ce0 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
26cf0 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
26d00 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
26d10 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
26d20 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
26d30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
26d40 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
26d50 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
26d60 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
26d70 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
26d80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
26d90 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
26da0 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
26db0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
26dc0 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
26dd0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
26de0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
26df0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
26e00 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
26e10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
26e20 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
26e30 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
26e40 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
26e50 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
26e60 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
26e70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
26e80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26e90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26ea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
26eb0 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
26ec0 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
26ed0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26ee0 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  dr));.        rc
26ef0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
26f00 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e(.            p
26f10 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61  Pager->jfd, zHea
26f20 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  der, sizeof(zHea
26f30 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  der), pPager->jo
26f40 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20  urnalHdr.       
26f50 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
26f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26f70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26f80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
26f90 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
26fa0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
26fb0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
26fc0 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
26fd0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
26fe0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
26ff0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
27000 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
27010 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
27020 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
27030 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
27040 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
27050 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
27060 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
27070 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
27080 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
27090 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
270a0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
270b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
270c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
270d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
270e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
270f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27100 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  Off;.      if( n
27110 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63  ewHdr && 0==(iDc
27120 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
27130 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20  FE_APPEND) ){.  
27140 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
27150 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
27160 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
27170 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
27180 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27190 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
271a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
271b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
271c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
271d0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
271e0 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
271f0 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68  ..  /* Unless th
27200 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
27210 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a  Sync mode, the j
27220 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20  ournal file was 
27230 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65  just .  ** succe
27240 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20  ssfully synced. 
27250 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61  Either way, clea
27260 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  r the PGHDR_NEED
27270 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20  _SYNC flag on . 
27280 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20   ** all pages.. 
27290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
272a0 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
272b0 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
272c0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53  e);.  pPager->eS
272d0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
272e0 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73  TER_DBMOD;.  ass
272f0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
27300 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
27310 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
27320 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27330 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
27340 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c  the first in a l
27350 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69  inked list of di
27360 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63  rty pages connec
27370 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67  ted.** by the Pg
27380 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
27390 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
273a0 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e  n writes each on
273b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  e of the.** in-m
273c0 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74  emory pages in t
273d0 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64  he list to the d
273e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
273f0 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a  e argument may.*
27400 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65  * be NULL, repre
27410 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79  senting an empty
27420 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63   list. In this c
27430 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ase this functio
27440 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e  n is.** a no-op.
27450 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
27460 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65   must hold at le
27470 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  ast a RESERVED l
27480 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75  ock when this fu
27490 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c  nction.** is cal
274a0 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74  led. Before writ
274b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ing anything to 
274c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
274d0 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20  e, this lock.** 
274e0 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20 61  is upgraded to a
274f0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
27500 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61  . If the lock ca
27510 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64  nnot be obtained
27520 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ,.** SQLITE_BUSY
27530 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
27540 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69 74   no data is writ
27550 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
27560 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
27570 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
27580 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67   a temp-file pag
27590 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75 61  er and the actua
275a0 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69  l file-system fi
275b0 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74  le.** is not yet
275c0 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65   open, it is cre
275d0 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20  ated and opened 
275e0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
275f0 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f  is .** written o
27600 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  ut..**.** Once t
27610 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
27620 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69   upgraded and, i
27630 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65  f necessary, the
27640 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a   file opened,.**
27650 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20 77   the pages are w
27660 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
27670 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27680 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57  in list order. W
27690 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65  riting.** a page
276a0 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20 69   is skipped if i
276b0 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f  t meets either o
276c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
276d0 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20  criteria:.**.** 
276e0 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d    * The page num
276f0 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
27700 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
27710 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20  , or.**   * The 
27720 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
27730 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20   flag is set on 
27740 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
27750 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61  If writing out a
27760 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68 65   page causes the
27770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
27780 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62  o grow, Pager.db
27790 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75  FileSize.** is u
277a0 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
277b0 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69 73  ly. If page 1 is
277c0 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68   written out, th
277d0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61 63  en the value cac
277e0 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e  hed.** in Pager.
277f0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
27800 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68  updated to match
27810 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73   the new value s
27820 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20  tored in.** the 
27830 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
27840 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
27850 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
27860 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
27870 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
27880 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  O error .** occu
27890 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  rs, an IO error 
278a0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
278b0 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43  . Or, if the EXC
278c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e  LUSIVE lock cann
278d0 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65  ot.** be obtaine
278e0 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  d, SQLITE_BUSY i
278f0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
27900 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
27910 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
27920 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
27930 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  Hdr *pList){.  i
27940 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27950 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
27960 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
27970 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
27980 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
27990 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c  y called for rol
279a0 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20  lback pagers in 
279b0 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
279c0 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
279d0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
279e0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
279f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
27a00 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
27a10 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
27a20 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
27a30 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
27a40 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
27a50 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
27a60 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
27a70 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
27a80 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
27a90 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
27aa0 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
27ab0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
27ac0 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
27ad0 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
27ae0 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
27af0 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
27b00 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
27b10 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
27b20 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27b30 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
27b40 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
27b50 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
27b60 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
27b70 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
27b80 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
27b90 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
27ba0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
27bb0 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
27bc0 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
27bd0 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
27be0 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
27bf0 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
27c00 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
27c10 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
27c20 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
27c30 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
27c40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27c50 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
27c60 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  ze>pPager->dbHin
27c70 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 71 6c  tSize ){.    sql
27c80 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
27c90 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
27ca0 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
27cb0 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
27cc0 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
27cd0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
27ce0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
27cf0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
27d00 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
27d10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
27d20 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
27d30 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
27d40 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
27d50 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
27d60 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
27d70 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
27d80 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
27d90 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
27da0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
27db0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
27dc0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
27dd0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
27de0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
27df0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
27e00 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
27e10 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
27e20 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
27e30 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
27e40 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
27e50 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
27e60 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
27e70 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
27e80 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
27e90 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
27ea0 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
27eb0 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
27ec0 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
27ed0 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
27ee0 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
27ef0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
27f00 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
27f10 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
27f20 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
27f30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
27f40 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
27f50 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
27f60 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
27f70 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
27f80 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
27f90 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
27fa0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
27fb0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fd0 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
27fe0 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
27ff0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
28000 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
28010 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
28020 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
28030 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
28040 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
28050 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20  unter(pList);.. 
28060 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
28070 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
28080 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
28090 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
280a0 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
280b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
280c0 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  pData);..      /
280d0 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20  * Write out the 
280e0 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20  page data. */.  
280f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28100 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28110 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
28120 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
28130 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  set);..      /* 
28140 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75  If page 1 was ju
28150 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  st written, upda
28160 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  te Pager.dbFileV
28170 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20  ers to match.   
28180 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
28190 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68  now stored in th
281a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
281b0 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73   If writing this
281c0 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20   .      ** page 
281d0 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62  caused the datab
281e0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
281f0 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53  , update dbFileS
28200 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  ize. .      */. 
28210 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31       if( pgno==1
28220 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
28230 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
28240 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
28250 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
28260 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
28270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
28280 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
28290 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
282a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
282b0 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
282c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
282d0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
282e0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
282f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
28300 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62  te any backup ob
28310 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68  jects copying th
28320 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
28330 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20  is pager. */.   
28340 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
28350 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
28360 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
28370 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29  8*)pList->pData)
28380 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  ;..      PAGERTR
28390 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70  ACE(("STORE %d p
283a0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
283b0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
283c0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
283d0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
283e0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
283f0 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49  List)));.      I
28400 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25  OTRACE(("PGOUT %
28410 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
28420 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50   pgno));.      P
28430 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
28440 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
28450 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73  count);.    }els
28460 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
28470 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
28480 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
28490 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
284a0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
284b0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
284c0 73 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70  sh(pList);.    p
284d0 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
284e0 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
284f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28500 20 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   Ensure that the
28510 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
28520 65 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74  e is open. If it
28530 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
28540 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
28550 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
28560 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
28570 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
28580 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
28590 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
285a0 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  . An .** SQLITE_
285b0 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
285c0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
285d0 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   if a call to sq
285e0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a  lite3OsOpen() .*
285f0 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * fails..*/.stat
28600 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
28610 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
28620 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
28630 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
28640 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
28650 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
28660 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
28670 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
28680 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
28690 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
286a0 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
286b0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
286c0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
286d0 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
286e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
286f0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
28700 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
28710 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
28720 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
28730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
28740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
28750 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
28760 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
28770 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
28780 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
28790 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  ** It is the cal
287a0 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
287b0 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52  ity to use subjR
287c0 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
287d0 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20   check .** that 
287e0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
287f0 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c  uired before cal
28800 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
28810 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  on..**.** If suc
28820 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
28830 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
28840 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
28850 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
28860 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
28870 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
28880 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
28890 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
288a0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
288b0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
288c0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
288d0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
288e0 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
288f0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
28900 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
28910 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
28920 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
28930 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
28940 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
28950 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
28960 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
28970 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
28980 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
28990 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
289a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
289b0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
289c0 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50  pPager;.  if( pP
289d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
289e0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
289f0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20  MODE_OFF ){..   
28a00 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62   /* Open the sub
28a10 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20  -journal, if it 
28a20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
28a30 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  been opened */. 
28a40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28a50 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
28a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
28a70 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
28a80 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
28a90 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61  pPager) );.    a
28aa0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
28ab0 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70  ager->sjfd) || p
28ac0 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d  Pager->nSubRec==
28ad0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
28ae0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
28af0 67 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c  ger) .         |
28b00 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  | pageInJournal(
28b10 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
28b20 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
28b30 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
28b40 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
28b50 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
28b60 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
28b70 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
28b80 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
28b90 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
28ba0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
28bb0 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
28bc0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
28bd0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
28be0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
28bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28c00 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
28c10 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
28c20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
28c30 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
28c40 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
28c50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
28c60 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
28c70 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
28c80 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
28c90 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
28ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28cb0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
28cc0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
28cd0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
28ce0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
28cf0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
28d00 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
28d10 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
28d20 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
28d30 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
28d40 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28d60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28d70 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28d80 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
28d90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
28da0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
28db0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
28dc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28dd0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
28de0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
28df0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
28e00 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
28e10 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
28e20 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
28e30 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
28e40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28e50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
28e60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
28e70 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
28e80 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
28e90 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
28ea0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
28eb0 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74  limit. The first
28ec0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
28ed0 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65  ointer to a Page
28ee0 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73  r object.** (cas
28ef0 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54  t as a void*). T
28f00 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61  he pager is alwa
28f10 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28  ys 'purgeable' (
28f20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
28f30 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54  .** database). T
28f40 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
28f50 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  nt is a referenc
28f60 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74  e to a page that
28f70 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   is .** currentl
28f80 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20  y dirty but has 
28f90 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
28fa0 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70  eferences. The p
28fb0 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73  age.** is always
28fc0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
28fd0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
28fe0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
28ff0 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65  first .** argume
29000 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  nt..**.** The jo
29010 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  b of this functi
29020 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50  on is to make pP
29030 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69  g clean by writi
29040 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ng its contents.
29050 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ** out to the da
29060 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20  tabase file, if 
29070 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d  possible. This m
29080 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69  ay involve synci
29090 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  ng the.** journa
290a0 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  l file. .**.** I
290b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71  f successful, sq
290c0 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
290d0 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  lean() is called
290e0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64   on the page and
290f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
29100 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
29110 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
29120 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  ile trying to ma
29130 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  ke the.** page c
29140 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72  lean, the IO err
29150 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
29160 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  ned. If the page
29170 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61   cannot be.** ma
29180 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d  de clean for som
29190 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20  e other reason, 
291a0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
291b0 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  urs, then SQLITE
291c0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
291d0 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61  ed by sqlite3Pca
291e0 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69  cheMakeClean() i
291f0 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f  s not called..*/
29200 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
29210 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c  rStress(void *p,
29220 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
29230 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
29240 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e  (Pager *)p;.  in
29250 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29260 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ;..  assert( pPg
29270 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
29280 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29290 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
292a0 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  IRTY );..  /* Th
292b0 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  e doNotSyncSpill
292c0 20 66 6c 61 67 20 69 73 20 73 65 74 20 64 75 72   flag is set dur
292d0 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
292e0 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
292f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
29300 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
29310 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
29320 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
29330 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
29340 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
29350 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
29360 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
29370 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
29380 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
29390 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
293a0 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
293b0 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66  The doNotSpill f
293c0 6c 61 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c  lag inhibits all
293d0 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20   cache spilling 
293e0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
293f0 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f  ether.  ** or no
29400 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75  t a sync is requ
29410 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  ired.  This is s
29420 65 74 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  et during a roll
29430 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
29440 53 70 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f  Spilling is also
29450 20 70 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e   prohibited when
29460 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
29470 74 65 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f  te since that co
29480 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f  uld.  ** lead to
29490 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
294a0 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63  tion.   In the c
294b0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
294c0 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73  aton it .  ** is
294d0 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20   impossible for 
294e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
294f0 63 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65  ch() to be calle
29500 64 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  d with createFla
29510 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20  g==1.  ** while 
29520 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
29530 74 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20  te, hence it is 
29540 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  impossible for t
29550 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20  his routine to. 
29560 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e   ** be called in
29570 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
29580 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
29590 20 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45   we include a NE
295a0 56 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20  VER().  ** test 
295b0 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  for the error st
295c0 61 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61  ate as a safegua
295d0 72 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72  rd against futur
295e0 65 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a  e changes..  */.
295f0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
29600 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72  er->errCode) ) r
29610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29620 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
29630 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75  oNotSpill ) retu
29640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29650 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
29660 74 53 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70  tSyncSpill && (p
29670 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
29680 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
29690 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
296a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
296b0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
296c0 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
296d0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
296e0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e    /* Write a sin
296f0 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68  gle frame for th
29700 69 73 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c  is page to the l
29710 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  og. */.    if( s
29720 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
29730 70 50 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72  pPg) ){ .      r
29740 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
29750 67 65 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a  ge(pPg); .    }.
29760 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
29780 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d  c = pagerWalFram
29790 65 73 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  es(pPager, pPg, 
297a0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
297b0 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
297c0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
297d0 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
297e0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
297f0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
29800 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c  EED_SYNC .     |
29810 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
29820 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
29830 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20  ACHEMOD.    ){. 
29840 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
29850 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29  urnal(pPager, 1)
29860 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
29870 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
29880 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
29890 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
298a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
298b0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
298c0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20  database image, 
298d0 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  it may need to b
298e0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
298f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   sub-journal..  
29900 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
29910 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
29920 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
29930 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
29940 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63  ll not.    ** ac
29950 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74  tually write dat
29960 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e  a to the file in
29970 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
29980 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64  **.    ** Consid
29990 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
299a0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65   sequence of eve
299b0 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nts:.    **.    
299c0 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  **   BEGIN;.    
299d0 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
299e0 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
299f0 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20     <modify page 
29a00 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41  X>.    **     SA
29a10 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20  VEPOINT sp;.    
29a20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b  **       <shrink
29a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
29a40 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a  o Y pages>.    *
29a50 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74 72  *       pagerStr
29a60 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20 20  ess(page X).    
29a70 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
29a80 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20  TO sp;.    **.  
29a90 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
29aa0 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
29ab0 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
29ac0 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
29ad0 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a  e written.    **
29ae0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
29af0 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
29b00 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
29b10 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
29b20 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  hen,.    ** foll
29b30 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42  owing the "ROLLB
29b40 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65  ACK TO sp" state
29b50 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61  ment, reading pa
29b60 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20  ge X will read. 
29b70 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20     ** data from 
29b80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29b90 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
29ba0 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
29bb0 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20   X as it.    ** 
29bc0 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72 61  was when the tra
29bd0 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
29be0 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20  , not as it was 
29bf0 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20  when "SAVEPOINT 
29c00 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65  sp".    ** was e
29c10 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  xecuted..    **.
29c20 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
29c30 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
29c40 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
29c50 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
29c60 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62   the .    ** sub
29c70 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
29c80 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
29c90 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
29ca0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
29cb0 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72      ** be restor
29cc0 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
29cd0 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
29ce0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
29cf0 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65  " is .    ** exe
29d00 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cuted..    */.  
29d10 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20    if( NEVER(.   
29d20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
29d30 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e  OK && pPg->pgno>
29d40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
29d50 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
29d60 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b  ge(pPg).    ) ){
29d70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a  .      rc = subj
29d80 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
29d90 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
29da0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
29db0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
29dc0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
29dd0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
29de0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29df0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
29e00 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
29e10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
29e20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
29e30 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
29e40 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
29e50 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
29e60 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
29e70 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
29e80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
29ea0 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
29eb0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
29ec0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29ed0 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
29ee0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
29ef0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
29f00 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
29f10 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
29f20 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  c); .}.../*.** A
29f30 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
29f40 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67  ialize a new Pag
29f50 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75  er object and pu
29f60 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  t a pointer to i
29f70 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72  t.** in *ppPager
29f80 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75  . The pager shou
29f90 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65  ld eventually be
29fa0 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e   freed by passin
29fb0 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  g it.** to sqlit
29fc0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a  e3PagerClose()..
29fd0 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
29fe0 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
29ff0 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2a000 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2a010 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69   open..** If zFi
2a020 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
2a030 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
2a040 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
2a050 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
2a060 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
2a070 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
2a080 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66  hed. Temporary f
2a090 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65  iles are be dele
2a0a0 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
2a0b0 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61  ally when they a
2a0c0 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46  re closed. If zF
2a0d0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
2a0e0 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61  ory:" then .** a
2a0f0 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
2a100 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
2a110 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
2a120 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a  tten to disk. .*
2a130 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73  * This can be us
2a140 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
2a150 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2a160 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
2a170 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65   nExtra paramete
2a180 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20  r specifies the 
2a190 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2a1a0 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
2a1b0 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68  ed.** along with
2a1c0 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72   each page refer
2a1d0 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65  ence. This space
2a1e0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f   is available to
2a1f0 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61   the user.** via
2a200 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
2a210 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e  rGetExtra() API.
2a220 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
2a230 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65   argument is use
2a240 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f  d to specify pro
2a250 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66  perties that aff
2a260 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  ect the.** opera
2a270 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
2a280 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  r. It should be 
2a290 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77  passed some bitw
2a2a0 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a  ise combination.
2a2b0 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f  ** of the PAGER_
2a2c0 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  * flags..**.** T
2a2d0 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
2a2e0 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
2a2f0 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
2a300 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2a310 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
2a320 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
2a330 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
2a340 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
2a350 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
2a360 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
2a370 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
2a380 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
2a390 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
2a3a0 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
2a3b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2a3c0 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
2a3d0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
2a3e0 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
2a3f0 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
2a400 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
2a410 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
2a420 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
2a430 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
2a440 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2a450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2a460 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
2a470 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
2a480 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
2a490 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
2a4a0 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
2a4b0 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
2a4c0 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
2a4d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2a4e0 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
2a4f0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
2a500 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
2a510 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
2a520 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
2a530 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
2a540 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
2a550 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
2a560 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
2a570 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
2a580 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
2a590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a5a0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
2a5b0 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
2a5c0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2a5d0 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
2a5e0 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
2a5f0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
2a600 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2a610 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
2a620 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
2a630 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
2a640 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
2a650 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
2a660 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
2a670 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
2a680 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
2a690 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20  it)(DbPage*) /* 
2a6a0 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e  Function to rein
2a6b0 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a  itialize pages *
2a6c0 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
2a6d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a6e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
2a6f0 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
2a700 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
2a710 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
2a720 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2a730 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2a740 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
2a750 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
2a760 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
2a770 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
2a780 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
2a790 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
2a7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a7b0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
2a7c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
2a7d0 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
2a7e0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
2a7f0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2a800 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
2a810 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
2a820 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
2a830 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2a840 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
2a850 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
2a860 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
2a870 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
2a880 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
2a890 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
2a8a0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
2a8b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a8c0 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
2a8d0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
2a8e0 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
2a8f0 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
2a900 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
2a910 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
2a920 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  al */.  int pcac
2a930 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
2a940 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
2a950 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
2a960 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
2a970 63 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50  che */.  u32 szP
2a980 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2a990 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2a9a0 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
2a9b0 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63  page size */.  c
2a9c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20  onst char *zUri 
2a9d0 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61  = 0;    /* URI a
2a9e0 72 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  rgs to copy */. 
2a9f0 20 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20   int nUri = 0;  
2aa00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2aa10 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2aa20 55 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72  URI args at *zUr
2aa30 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  i */..  /* Figur
2aa40 65 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73  e out how much s
2aa50 70 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64  pace is required
2aa60 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61   for each journa
2aa70 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20  l file-handle.  
2aa80 2a 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77  ** (there are tw
2aa90 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d  o of them, the m
2aaa0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
2aab0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29  the sub-journal)
2aac0 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74  . This.  ** is t
2aad0 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
2aae0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
2aaf0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
2ab00 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a  al file handle .
2ab10 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c    ** and a regul
2ab20 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ar journal file-
2ab30 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61  handle. Note tha
2ab40 74 20 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75  t a "regular jou
2ab50 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a  rnal-handle".  *
2ab60 2a 20 6d 61 79 20 62 65 20 61 20 77 72 61 70 70  * may be a wrapp
2ab70 65 72 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61  er capable of ca
2ab80 63 68 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ching the first 
2ab90 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  portion of the j
2aba0 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
2abb0 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d   in memory to im
2abc0 70 6c 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d  plement the atom
2abd0 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
2abe0 61 74 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a  ation (see .  **
2abf0 20 73 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75   source file jou
2ac00 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20  rnal.c)..  */.  
2ac10 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
2ac20 61 6c 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c  alSize(pVfs)>sql
2ac30 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
2ac40 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72  ze() ){.    jour
2ac50 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f  nalFileSize = RO
2ac60 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72  UND8(sqlite3Jour
2ac70 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a  nalSize(pVfs));.
2ac80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
2ac90 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2aca0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d  OUND8(sqlite3Mem
2acb0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a  JournalSize());.
2acc0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
2acd0 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2ace0 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2acf0 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2ad00 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2ad10 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2ad20 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2ad30 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2ad40 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2ad50 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2ad60 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2ad70 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2ad80 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2ad90 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2ada0 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2adb0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2adc0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2add0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ade0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74  OMEM;.      nPat
2adf0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
2ae00 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
2ae10 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e  e);.      zFilen
2ae20 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ame = 0;.    }. 
2ae30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
2ae40 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
2ae50 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
2ae60 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
2ae70 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
2ae80 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
2ae90 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
2aea0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
2aeb0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
2aec0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
2aed0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
2aee0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
2aef0 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
2af00 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2af10 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2af20 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  0] ){.    const 
2af30 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61  char *z;.    nPa
2af40 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
2af50 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
2af60 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2af70 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
2af80 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  0, nPathname*2);
2af90 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2afa0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2afb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2afc0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  EM;.    }.    zP
2afd0 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2afe0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2aff0 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2b000 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2b010 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2b020 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2b030 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2b040 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2b050 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2b060 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2b070 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2b080 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2b090 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2b0a0 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2b0b0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2b0c0 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2b0d0 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2b0e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2b0f0 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2b100 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2b110 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2b120 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2b130 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2b140 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2b150 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2b160 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2b170 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2b180 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2b190 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2b1a0 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2b1b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2b1c0 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2b1d0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2b1e0 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2b1f0 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2b200 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2b210 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2b220 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2b230 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2b240 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2b250 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2b260 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2b270 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2b280 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2b290 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2b2a0 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2b2b0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2b2c0 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2b2d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2b2e0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2b2f0 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2b300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2b320 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2b330 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2b340 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2b350 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
2b360 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ate memory for t
2b370 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2b380 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63  re, PCache objec
2b390 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65  t, the.  ** thre
2b3a0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2b3b0 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  rs, the database
2b3c0 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74   file name and t
2b3d0 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2b3e0 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20   file name. The 
2b3f0 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79  layout in memory
2b400 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
2b410 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61    **.  **     Pa
2b420 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20  ger object      
2b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2b440 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79 74  izeof(Pager) byt
2b450 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61  es).  **     PCa
2b460 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20  che object      
2b470 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2b480 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2b490 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2b4a0 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2b4b0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20  handle          
2b4c0 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c    (pVfs->szOsFil
2b4d0 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2b4e0 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69    Sub-journal fi
2b4f0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2b500 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69    (journalFileSi
2b510 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  ze bytes).  **  
2b520 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20     Main journal 
2b530 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2b540 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2b550 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2b560 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
2b570 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
2b580 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31      (nPathname+1
2b590 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2b5a0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   Journal file na
2b5b0 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2b5c0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20   (nPathname+8+1 
2b5d0 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50  bytes).  */.  pP
2b5e0 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  tr = (u8 *)sqlit
2b5f0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20  e3MallocZero(.  
2b600 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28    ROUND8(sizeof(
2b610 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20 20  *pPager)) +     
2b620 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
2b630 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ure */.    ROUND
2b640 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20  8(pcacheSize) + 
2b650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61            /* PCa
2b660 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  che object */.  
2b670 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73    ROUND8(pVfs->s
2b680 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20  zOsFile) +      
2b690 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
2b6a0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72  file */.    jour
2b6b0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20  nalFileSize * 2 
2b6c0 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  +          /* Th
2b6d0 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
2b6e0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74  les */ .    nPat
2b6f0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2b700 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46   +         /* zF
2b710 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  ilename */.    n
2b720 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32  Pathname + 8 + 2
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b740 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66   zJournal */.#if
2b750 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b760 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68  _WAL.    + nPath
2b770 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20  name + 4 + 2    
2b780 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20          /* zWal 
2b790 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20  */.#endif.  );. 
2b7a0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2b7b0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
2b7c0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2b7d0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2b7e0 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
2b7f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2b800 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2b810 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
2b820 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2b830 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2b840 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2b850 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2b860 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2b870 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2b880 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2b890 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2b8a0 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2b8b0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2b8c0 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2b8d0 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2b8e0 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2b8f0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2b900 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2b910 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2b920 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2b930 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2b940 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2b950 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2b960 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2b970 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2b980 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2b990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2b9a0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2b9b0 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2b9c0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2b9d0 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2b9e0 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2b9f0 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2ba00 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2ba10 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2ba20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2ba30 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2ba40 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2ba50 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2ba60 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2ba70 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2ba80 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2ba90 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2baa0 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2bab0 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  );.    if( nUri 
2bac0 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72  ) memcpy(&pPager
2bad0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2bae0 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2baf0 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2bb00 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2bb10 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2bb20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2bb30 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2bb40 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2bb50 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30  e], "-journal\00
2bb60 30 22 2c 20 38 2b 31 29 3b 0a 20 20 20 20 73 71  0", 8+1);.    sq
2bb70 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2bb80 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2bb90 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  me, pPager->zJou
2bba0 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  rnal);.#ifndef S
2bbb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2bbc0 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2bbd0 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2bbe0 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2bbf0 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2bc00 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2bc10 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2bc20 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2bc30 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2bc40 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30  thname], "-wal\0
2bc50 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73  00", 4+1);.    s
2bc60 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2bc70 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2bc80 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2bc90 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2bca0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2bcb0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2bcc0 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2bcd0 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2bce0 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2bcf0 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2bd00 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2bd10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2bd20 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2bd30 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2bd40 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bd60 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2bd70 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2bd80 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2bd90 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2bda0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2bdb0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2bdc0 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2bdd0 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2bde0 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  Db );.    readOn
2bdf0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
2be00 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2be10 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2be20 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
2be30 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
2be40 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2be50 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
2be60 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
2be70 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
2be80 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
2be90 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
2bea0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
2beb0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2bec0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2bed0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
2bee0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
2bef0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
2bf00 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
2bf10 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
2bf20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
2bf30 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
2bf40 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
2bf50 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
2bf60 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
2bf70 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
2bf80 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2bf90 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
2bfa0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
2bfb0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2bfc0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
2bfd0 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
2bfe0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
2bff0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2c000 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
2c010 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
2c020 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2c030 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
2c040 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2c050 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2c060 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2c070 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
2c080 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
2c090 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2c0a0 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
2c0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c0c0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2c0d0 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63  (u32)pPager->sec
2c0e0 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
2c0f0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
2c100 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c110 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
2c120 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
2c130 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
2c140 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2c150 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
2c160 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
2c170 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
2c180 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2c190 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
2c1a0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
2c1b0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2c1c0 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2c1d0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2c1e0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
2c1f0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2c200 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
2c210 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
2c220 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
2c230 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2c240 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
2c250 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
2c260 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
2c270 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
2c280 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
2c290 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2c2a0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
2c2b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2c2c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2c2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2c2e0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2c2f0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2c300 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2c310 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2c320 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2c330 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2c340 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2c350 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2c360 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2c370 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2c380 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2c390 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2c3a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2c3b0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2c3c0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2c3d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2c3e0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2c3f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2c400 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2c410 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2c420 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2c430 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2c440 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2c450 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2c460 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2c470 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
2c480 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2c490 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2c4a0 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61  _READER;.    pPa
2c4b0 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2c4c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
2c4d0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
2c4e0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2c4f0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
2c500 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2c510 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
2c520 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
2c530 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
2c540 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
2c550 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2c560 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
2c570 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
2c580 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
2c590 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c5a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2c5b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
2c5c0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
2c5d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
2c5e0 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
2c5f0 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
2c600 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2c610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c620 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
2c630 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
2c640 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
2c650 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
2c660 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
2c670 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2c680 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2c690 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2c6a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c6b0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2c6c0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
2c6d0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2c6e0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2c6f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2c700 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
2c710 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2c720 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2c730 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
2c740 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
2c750 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2c760 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2c770 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
2c780 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
2c790 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
2c7a0 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
2c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
2c7c0 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
2c7d0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
2c7e0 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
2c7f0 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
2c800 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2c810 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2c820 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2c830 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2c840 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2c850 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2c860 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2c870 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2c880 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2c890 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2c8a0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2c8b0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2c8c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2c8d0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2c8e0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2c8f0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c900 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2c910 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c920 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2c930 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c940 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2c950 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2c960 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2c970 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
2c980 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2c990 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
2c9a0 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
2c9b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2c9c0 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
2c9d0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
2c9e0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
2c9f0 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61  .#endif.  /* pPa
2ca00 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2ca10 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2ca20 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2ca30 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2ca40 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2ca50 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2ca60 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2ca70 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2ca80 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2ca90 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2caa0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2cab0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2cac0 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2cad0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2cae0 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2caf0 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2cb00 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2cb10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2cb20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2cb30 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2cb40 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2cb50 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2cb60 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2cb70 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2cb80 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2cb90 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2cba0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2cbb0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2cbc0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
2cbd0 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
2cbe0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
2cbf0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
2cc00 20 30 20 3a 20 53 51 4c 49 54 45 5f 53 59 4e 43   0 : SQLITE_SYNC
2cc10 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 50 61 67 65  _NORMAL;.  pPage
2cc20 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2cc30 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   = pPager->syncF
2cc40 6c 61 67 73 3b 0a 20 20 69 66 28 20 70 50 61 67  lags;.  if( pPag
2cc50 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2cc60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2cc70 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
2cc80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2cc90 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
2cca0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ccb0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
2ccc0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2ccd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2cce0 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30  ckptSyncFlags==0
2ccf0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2cd00 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2cd10 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
2cd20 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53  r->syncFlags = S
2cd30 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2cd40 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  L;.    pPager->w
2cd50 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  alSyncFlags = SQ
2cd60 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2cd70 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e   | WAL_SYNC_TRAN
2cd80 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50  SACTIONS;.    pP
2cd90 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
2cda0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2cdb0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
2cdc0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2cdd0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2cde0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2cdf0 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2ce00 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2ce10 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2ce20 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2ce30 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2ce40 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2ce50 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2ce60 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2ce70 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2ce80 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ce90 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2cea0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2ceb0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2cec0 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2ced0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2cee0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2cef0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2cf00 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
2cf10 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
2cf20 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
2cf30 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2cf40 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
2cf50 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
2cf60 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
2cf70 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
2cf80 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
2cf90 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2cfa0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
2cfb0 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  nit;.  /* memset
2cfc0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
2cfd0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
2cfe0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 0a 20  ->aHash)); */.. 
2cff0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2d000 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2d010 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
2d020 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2d030 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
2d040 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
2d050 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
2d060 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
2d070 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
2d080 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
2d090 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
2d0a0 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
2d0b0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
2d0c0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
2d0d0 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
2d0e0 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
2d0f0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
2d100 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
2d110 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
2d120 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
2d130 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
2d140 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
2d150 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
2d160 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
2d170 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2d180 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
2d190 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
2d1a0 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
2d1b0 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2d1c0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2d1d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2d1e0 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
2d1f0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2d200 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
2d210 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
2d220 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
2d230 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
2d240 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
2d250 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2d260 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
2d270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
2d280 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
2d290 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d2a0 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
2d2b0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
2d2c0 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
2d2d0 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
2d2e0 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
2d2f0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
2d300 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
2d310 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
2d320 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2d330 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
2d340 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
2d350 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
2d360 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
2d370 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
2d380 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
2d390 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d3a0 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
2d3b0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
2d3c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2d3d0 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
2d3e0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
2d3f0 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
2d400 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
2d410 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
2d420 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
2d430 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2d440 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2d450 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
2d460 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
2d470 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
2d480 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2d490 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
2d4a0 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
2d4b0 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
2d4c0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2d4d0 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2d4e0 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
2d4f0 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
2d500 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
2d510 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
2d520 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
2d530 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
2d540 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
2d550 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
2d560 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
2d570 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2d580 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
2d590 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
2d5a0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
2d5b0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2d5c0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2d5d0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
2d5e0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
2d5f0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
2d600 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2d610 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
2d620 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
2d630 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2d640 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
2d650 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
2d660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d670 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
2d680 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2d690 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
2d6a0 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
2d6b0 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
2d6c0 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
2d6d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d6e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2d6f0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
2d700 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
2d710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2d720 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
2d730 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
2d740 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
2d750 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
2d760 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
2d770 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2d780 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
2d790 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2d7a0 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
2d7b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2d7c0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2d7d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e  ;..  assert( jrn
2d7e0 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71  lOpen==0 || ( sq
2d7f0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2d800 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2d810 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20  ger->jfd) &.    
2d820 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
2d830 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
2d840 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78  EN.  ));..  *pEx
2d850 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  ists = 0;.  if( 
2d860 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2d870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2d880 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
2d890 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
2d8a0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2d8b0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
2d8c0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2d8d0 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
2d8e0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
2d8f0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
2d900 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
2d910 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
2d920 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2d930 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
2d940 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
2d950 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
2d960 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
2d970 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
2d980 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
2d990 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
2d9a0 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
2d9b0 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
2d9c0 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
2d9d0 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
2d9e0 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2d9f0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
2da00 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
2da10 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
2da20 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2da30 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
2da40 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
2da50 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
2da60 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
2da70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
2da80 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
2da90 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2daa0 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
2dab0 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
2dac0 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
2dad0 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
2dae0 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
2daf0 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
2db00 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
2db10 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
2db20 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
2db30 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2db40 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2db50 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
2db60 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
2db70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2db80 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
2db90 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  {.      Pgno nPa
2dba0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2dbb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2dbc0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2dbd0 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
2dbe0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73    /* Check the s
2dbf0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2dc00 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20  ase file. If it 
2dc10 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61  consists of 0 pa
2dc20 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ges,.      ** th
2dc30 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2dc40 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20  urnal file. See 
2dc50 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
2dc60 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20  nt above for .  
2dc70 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f      ** the reaso
2dc80 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65  ning here.  Dele
2dc90 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20  te the obsolete 
2dca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64  journal file und
2dcb0 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45  er.      ** a RE
2dcc0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
2dcd0 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74  void race condit
2dce0 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69  ions and to avoi
2dcf0 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20  d violating.    
2dd00 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20    ** [H33020].. 
2dd10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2dd20 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
2dd30 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
2dd40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2dd50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dd60 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
2dd70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2dd80 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
2dd90 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2dda0 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72 4c        if( pagerL
2ddb0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
2ddc0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51  SERVED_LOCK)==SQ
2ddd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dde0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2ddf0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
2de00 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
2de10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2de20 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
2de30 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67 65  usiveMode ) page
2de40 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
2de50 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2de60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2de70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
2de80 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
2de90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2dea0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2deb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2dec0 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  sts and no other
2ded0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
2dee0 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20 20  a reserved.     
2def0 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61 74       ** or great
2df00 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
2df10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f  atabase file. No
2df20 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
2df30 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  re is.          
2df40 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
2df50 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20 61  non-zero bytes a
2df60 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
2df70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2df80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
2df90 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e 20   there is, then 
2dfa0 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  we consider this
2dfb0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 68   journal to be h
2dfc0 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20  ot. If not, .   
2dfd0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
2dfe0 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20   be ignored..   
2dff0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e000 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65      if( !jrnlOpe
2e010 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
2e020 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53 51   int f = .#if SQ
2e030 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
2e040 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
2e050 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
2e060 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
2e070 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
2e080 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65  ECTION_MASK)|.#e
2e090 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
2e0a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
2e0b0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
2e0c0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2e0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2e0e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
2e0f0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
2e100 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
2e110 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20  >jfd, f, &f);.  
2e120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e130 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e150 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d 20       u8 first = 
2e160 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2e170 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
2e180 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28  d(pPager->jfd, (
2e190 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31  void *)&first, 1
2e1a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2e1b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e1c0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
2e1d0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
2e1e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e1f0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  K;.            }
2e200 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e210 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2e220 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2e230 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
2e240 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
2e250 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e260 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66     *pExists = (f
2e270 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20  irst!=0);.      
2e280 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2e290 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
2e2a0 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N ){.           
2e2b0 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74   /* If we cannot
2e2c0 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   open the rollba
2e2d0 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ck journal file 
2e2e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20  in order to see 
2e2f0 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  if.            *
2e300 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f  * its has a zero
2e310 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
2e320 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
2e330 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
2e340 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
2e350 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
2e360 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
2e370 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
2e380 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
2e390 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
2e3a0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
2e3b0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
2e3c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
2e3d0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
2e3e0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
2e3f0 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
2e400 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
2e410 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
2e420 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
2e430 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
2e440 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
2e450 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
2e460 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
2e470 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
2e480 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
2e490 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
2e4a0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
2e4b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
2e4c0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
2e4d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
2e4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2e500 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
2e510 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2e520 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2e530 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2e540 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2e550 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e560 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2e570 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2e580 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
2e590 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2e5a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
2e5b0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
2e5c0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2e5d0 41 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20  Acquire() until 
2e5e0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
2e5f0 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ion.** has been 
2e600 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c  successfully cal
2e610 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64  led. If a shared
2e620 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79  -lock is already
2e630 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68   held when.** th
2e640 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2e650 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
2e660 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
2e670 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74  following operat
2e680 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65  ions are also pe
2e690 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20  rformed by this 
2e6a0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
2e6b0 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65    1) If the page
2e6c0 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  r is currently i
2e6d0 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61  n PAGER_OPEN sta
2e6e0 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
2e6f0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
2e700 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
2e710 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2e720 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
2e730 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
2e740 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
2e750 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
2e760 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
2e770 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
2e780 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
2e790 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
2e7a0 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
2e7b0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
2e7c0 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
2e7d0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
2e7e0 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
2e7f0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
2e800 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
2e810 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
2e820 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
2e830 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
2e840 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
2e850 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
2e860 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
2e870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e880 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
2e890 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
2e8a0 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
2e8b0 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
2e8c0 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
2e8d0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
2e8e0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
2e8f0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
2e900 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
2e910 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
2e920 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
2e930 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
2e940 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
2e950 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
2e960 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
2e970 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
2e980 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
2e990 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
2e9a0 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
2e9b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
2e9c0 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
2e9d0 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
2e9e0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
2e9f0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
2ea00 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
2ea10 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
2ea20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2ea30 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2ea40 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c   .** occurs whil
2ea50 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
2ea60 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
2ea70 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2ea80 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72  al file or .** r
2ea90 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
2eaa0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
2eab0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2eac0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2ead0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  t sqlite3PagerSh
2eae0 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
2eaf0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2eb00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2eb20 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2eb30 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2eb40 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
2eb50 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e  d from b-tree an
2eb60 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72  d only when ther
2eb70 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75  e are no.  ** ou
2eb80 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e  tstanding pages.
2eb90 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68   This implies th
2eba0 61 74 20 74 68 65 20 70 61 67 65 72 20 73 74 61  at the pager sta
2ebb0 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72  te should either
2ebc0 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72  .  ** be OPEN or
2ebd0 20 52 45 41 44 45 52 2e 20 52 45 41 44 45 52 20   READER. READER 
2ebe0 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  is only possible
2ebf0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
2ec00 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a   or was in .  **
2ec10 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
2ec20 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  s mode..  */.  a
2ec30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
2ec40 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
2ec50 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
2ec60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
2ec70 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
2ec80 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
2ec90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2eca0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2ecb0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2ecc0 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
2ecd0 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
2ece0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2ecf0 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74  >errCode) ){ ret
2ed00 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2ed10 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70  ode; }..  if( !p
2ed20 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2ed30 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
2ed40 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2ed50 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
2ed60 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
2ed70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ed80 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
2ed90 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
2eda0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
2edb0 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20   !MEMDB );..    
2edc0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
2edd0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
2ede0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
2edf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ee00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2ee10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
2ee20 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck==NO_LOCK || p
2ee30 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
2ee40 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
2ee50 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2ee60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2ee70 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2ee80 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65   exists, and the
2ee90 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45  re is no RESERVE
2eea0 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  D lock on the.  
2eeb0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2eec0 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
2eed0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
2eee0 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
2eef0 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
2ef00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
2ef10 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
2ef20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
2ef30 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
2ef40 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61  ger, &bHotJourna
2ef50 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
2ef60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ef70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61  ){.      goto fa
2ef80 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
2ef90 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  if( bHotJournal 
2efa0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  ){.      /* Get 
2efb0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2efc0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
2efd0 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
2efe0 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
2eff0 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
2f000 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
2f010 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
2f020 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
2f030 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
2f040 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
2f050 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
2f060 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2f070 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
2f080 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
2f090 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
2f0a0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
2f0b0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
2f0c0 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
2f0d0 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
2f0e0 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
2f0f0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
2f100 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
2f110 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
2f120 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
2f130 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
2f140 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
2f150 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
2f160 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
2f170 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
2f180 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
2f190 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
2f1a0 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
2f1b0 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
2f1c0 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
2f1d0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
2f1e0 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
2f1f0 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
2f200 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
2f210 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
2f220 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
2f230 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
2f240 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
2f250 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  is in locking_mo
2f260 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
2f270 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20  e, the lock is. 
2f280 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64       ** downgrad
2f290 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43  ed to SHARED_LOC
2f2a0 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  K before this fu
2f2b0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
2f2c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2f2d0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
2f2e0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
2f2f0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  E_LOCK);.      i
2f300 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f310 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
2f320 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
2f330 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  . .      /* If i
2f340 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2f350 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69   open and the fi
2f360 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  le exists on dis
2f370 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20  k, open the .   
2f380 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f     ** journal fo
2f390 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
2f3a0 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73  ess. Write acces
2f3b0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
2f3c0 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  cause .      ** 
2f3d0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
2f3e0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
2f3f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
2f400 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a  l be kept open .
2f410 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73        ** and pos
2f420 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
2f430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
2f440 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69  er on. Also, wri
2f450 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20  te-access .     
2f460 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72   ** is usually r
2f470 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c  equired to final
2f480 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
2f490 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
2f4a0 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a  persist .      *
2f4b0 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f  * mode (and also
2f4c0 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   for journal_mod
2f4d0 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f  e=truncate on so
2f4e0 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20  me systems)..   
2f4f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
2f500 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
2f510 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
2f520 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
2f530 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
2f540 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
2f550 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
2f560 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
2f570 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
2f580 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
2f590 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
2f5a0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
2f5b0 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
2f5c0 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  t .      ** may 
2f5d0 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
2f5e0 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
2f5f0 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
2f600 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
2f610 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
2f620 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
2f630 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
2f640 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
2f650 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
2f660 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2f670 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2f680 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2f690 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2f6a0 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  s;.        int b
2f6b0 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  Exists;         
2f6c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2f6d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2f6e0 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  sts */.        r
2f6f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2f700 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20  ess(.           
2f710 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
2f720 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
2f730 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
2f740 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  bExists);.      
2f750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2f760 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29  _OK && bExists )
2f770 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2f780 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
2f790 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66      int f = .#if
2f7a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
2f7b0 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
2f7c0 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
2f7d0 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c  er->vfsFlags&SQL
2f7e0 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f  ITE_OPEN_FILEPRO
2f7f0 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23  TECTION_MASK)|.#
2f800 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
2f810 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
2f820 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
2f830 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
2f840 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2f850 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
2f860 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20  pFile );.       
2f870 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2f880 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2f890 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
2f8a0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
2f8b0 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
2f8c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2f8d0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
2f8e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2f8f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2f900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66  ==SQLITE_OK && f
2f910 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2f920 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  READONLY ){.    
2f930 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2f940 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2f950 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  T;.            s
2f960 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
2f970 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2f980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f990 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  }.      }. .    
2f9a0 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
2f9b0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
2f9c0 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
2f9d0 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
2f9e0 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
2f9f0 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
2fa00 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
2fa10 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
2fa20 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
2fa30 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
2fa40 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
2fa50 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
2fa60 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
2fa70 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
2fa80 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f  he.  Sync the ho
2fa90 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t journal before
2faa0 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a   playing.      *
2fab0 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20  * it back since 
2fac0 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
2fad0 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66   crashed and lef
2fae0 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  t the hot journa
2faf0 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61  l.      ** proba
2fb00 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63  bly did not sync
2fb10 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72   it and we are r
2fb20 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79  equired to alway
2fb30 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20  s sync.      ** 
2fb40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
2fb50 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61  re playing it ba
2fb60 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
2fb70 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
2fb80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2fb90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2fba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2fbb0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2fbc0 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28  rSyncHotJournal(
2fbd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
2fbe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2fbf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2fc00 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
2fc10 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
2fc20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
2fc30 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2fc40 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d  _OPEN;.        }
2fc50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2fc60 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
2fc70 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
2fc80 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62     pagerUnlockDb
2fc90 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2fca0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  LOCK);.      }..
2fcb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2fcc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2fcd0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2fce0 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e  h is taken if an
2fcf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2fd00 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70  ile trying to op
2fd10 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  en.        ** or
2fd20 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74   roll back a hot
2fd30 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68  -journal while h
2fd40 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
2fd50 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
2fd60 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75        ** pager_u
2fd70 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  nlock() routine 
2fd80 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62  will be called b
2fd90 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
2fda0 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20  to unlock.      
2fdb0 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49    ** the file. I
2fdc0 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74  f the unlock att
2fdd0 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e  empt fails, then
2fde0 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73   Pager.eLock mus
2fdf0 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  t be.        ** 
2fe00 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
2fe10 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d  OCK (see the com
2fe20 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
2fe30 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20  define for .    
2fe40 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c      ** UNKNOWN_L
2fe50 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e  OCK above for an
2fe60 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a   explanation). .
2fe70 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2fe80 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74     ** In order t
2fe90 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f  o get pager_unlo
2fea0 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c  ck() to do this,
2feb0 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74   set Pager.eStat
2fec0 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  e to.        ** 
2fed0 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e  PAGER_ERROR now.
2fee0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74   This is not act
2fef0 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73  ually counted as
2ff00 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20   a transition.  
2ff10 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f        ** to ERRO
2ff20 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73  R state in the s
2ff30 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20  tate diagram at 
2ff40 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20  the top of this 
2ff50 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a  file,.        **
2ff60 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
2ff70 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c  hat the same cal
2ff80 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
2ff90 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20  k() will very.  
2ffa0 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79        ** shortly
2ffb0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20   transition the 
2ffc0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  pager object to 
2ffd0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
2ffe0 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20  Calling.        
2fff0 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  ** assert_pager_
30000 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61  state() would fa
30010 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68  il now, as it sh
30020 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73  ould not be poss
30030 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ible.        ** 
30040 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73  to be in ERROR s
30050 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20  tate when there 
30060 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e  are zero outstan
30070 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20  ding page .     
30080 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
30090 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
300a0 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
300b0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
300c0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
300d0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
300e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
300f0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
30100 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73  OPEN );.      as
30110 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
30120 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
30130 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  K).           ||
30140 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
30150 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
30160 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  r->eLock>SHARED_
30170 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20  LOCK).      );. 
30180 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70     }..    if( !p
30190 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
301a0 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72  .     && (pPager
301b0 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c  ->pBackup || sql
301c0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
301d0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
301e0 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29 7b 0a  che)>0) .    ){.
301f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
30200 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
30210 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
30220 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30230 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  file.      ** an
30240 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
30250 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
30260 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
30270 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a  revious.      **
30280 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
30290 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
302a0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
302b0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
302c0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
302d0 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
302e0 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
302f0 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
30300 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
30310 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
30320 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
30330 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
30340 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
30350 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
30360 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
30370 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
30380 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
30390 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
303a0 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
303b0 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
303c0 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
303d0 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
303e0 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
303f0 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
30400 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
30410 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
30420 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
30430 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
30440 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
30450 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
30460 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
30470 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
30480 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
30490 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
304a0 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
304b0 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
304c0 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
304d0 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
304e0 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
304f0 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
30500 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50        */.      P
30510 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20  gno nPage = 0;. 
30520 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
30530 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
30540 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
30550 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ;..      rc = pa
30560 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
30570 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
30580 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
30590 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20  o failed;..     
305a0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
305b0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
305c0 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
305d0 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
305e0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
305f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
30600 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
30610 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
30620 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
30630 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
30640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
30650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30660 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
30670 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
30680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30690 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
306a0 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
306b0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
306c0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
306d0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
306e0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
306f0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
30700 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
30710 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
30720 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
30730 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
30740 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
30750 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65   WAL file in the
30760 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70   file-system, op
30770 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65  en this database
30780 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d   in WAL.    ** m
30790 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
307a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
307b0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61  nction call is a
307c0 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
307d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
307e0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50  nWalIfPresent(pP
307f0 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53  ager);.#ifndef S
30800 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
30810 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
30820 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63  r->pWal==0 || rc
30830 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23  ==SQLITE_OK );.#
30840 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
30850 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
30860 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
30870 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
30880 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
30890 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
308a0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
308b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
308c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
308d0 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
308e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
308f0 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
30900 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
30910 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
30920 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
30930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30940 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
30950 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
30960 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
30970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
30980 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30990 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
309a0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
309b0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
309c0 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65  READER;.  }.  re
309d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
309e0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
309f0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
30a00 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
30a10 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
30a20 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
30a30 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
30a40 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
30a50 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
30a60 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
30a70 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
30a80 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
30a90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
30aa0 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
30ab0 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
30ac0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
30ad0 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
30ae0 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
30af0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
30b00 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
30b10 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
30b20 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
30b30 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
30b40 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
30b50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
30b60 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72  =0) ){.    pager
30b70 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
30b80 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
30b90 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
30ba0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
30bb0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20  age number pgno 
30bc0 69 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20  in pager pPager 
30bd0 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72  (a page.** refer
30be0 65 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62  ence has type Db
30bf0 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72  Page*). If the r
30c00 65 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e  equested referen
30c10 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73  ce is .** succes
30c20 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c  sfully obtained,
30c30 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
30c40 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c   *ppPage and SQL
30c50 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
30c60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
30c70 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
30c80 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
30c90 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
30ca0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
30cb0 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
30cc0 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
30cd0 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
30ce0 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
30cf0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
30d00 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
30d10 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
30d20 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
30d30 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
30d40 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
30d50 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
30d60 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
30d70 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
30d80 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
30d90 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
30da0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
30db0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
30dc0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
30dd0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
30de0 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
30df0 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
30e00 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
30e10 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
30e20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
30e30 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
30e40 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
30e50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30e60 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
30e70 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
30e80 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
30e90 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
30ea0 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
30eb0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
30ec0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
30ed0 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
30ee0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
30ef0 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
30f00 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
30f10 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
30f20 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
30f30 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
30f40 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
30f50 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
30f60 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
30f70 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
30f80 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
30f90 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
30fa0 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
30fb0 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
30fc0 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
30fd0 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
30fe0 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
30ff0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
31000 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
31010 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
31020 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
31030 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
31040 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
31050 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65  two seperate sce
31060 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
31070 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
31080 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
31090 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
310a0 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
310b0 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
310c0 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
310d0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
310e0 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
310f0 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
31100 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
31110 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
31120 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
31130 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
31140 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
31150 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
31160 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
31170 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
31180 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
31190 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  roed instead of.
311a0 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  ** being read fr
311b0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
311c0 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
311d0 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
311e0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
311f0 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
31200 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
31210 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
31220 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
31230 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
31240 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
31250 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
31260 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
31270 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
31280 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
31290 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
312a0 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
312b0 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
312c0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
312d0 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
312e0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
312f0 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
31300 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
31310 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
31320 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
31330 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
31340 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
31350 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
31360 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
31370 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
31380 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
31390 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
313a0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
313b0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
313c0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
313d0 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
313e0 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
313f0 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
31400 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
31410 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
31420 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
31430 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
31440 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
31450 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
31460 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
31470 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
31480 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
31490 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
314a0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
314b0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
314c0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
314d0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
314e0 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
314f0 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
31500 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
31510 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
31520 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
31530 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
31540 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
31550 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
31560 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
31570 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
31580 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
31590 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
315a0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
315b0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
315c0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
315d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
315e0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
315f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31600 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
31610 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
31620 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
31630 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
31640 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
31650 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
31660 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
31670 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
31680 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
31690 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
316a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
316b0 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72  r *pPg;..  asser
316c0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
316d0 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
316e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
316f0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
31700 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
31710 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ( pgno==0 ){.   
31720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
31730 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
31740 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
31750 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
31760 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
31770 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
31780 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
31790 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
317a0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
317b0 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
317c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
317d0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
317e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
317f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
31800 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
31810 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
31820 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
31830 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
31840 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20   ppPage);.  }.. 
31850 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31860 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  OK ){.    /* Eit
31870 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  her the call to 
31880 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
31890 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e  ch() returned an
318a0 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20   error or the.  
318b0 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61    ** pager was a
318c0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72  lready in the er
318d0 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
318e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
318f0 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20   called..    ** 
31900 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64  Set pPg to 0 and
31910 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63   jump to the exc
31920 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20  eption handler. 
31930 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   */.    pPg = 0;
31940 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f  .    goto pager_
31950 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d  acquire_err;.  }
31960 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
31970 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
31980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
31990 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d  ppPage)->pPager=
319a0 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70 70 50  =pPager || (*ppP
319b0 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 30 20  age)->pPager==0 
319c0 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70 50 61  );..  if( (*ppPa
319d0 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26 20 21  ge)->pPager && !
319e0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
319f0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
31a00 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72 65   the pcache alre
31a10 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  ady contains an 
31a20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70 79  initialized copy
31a30 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   of.    ** the p
31a40 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74 68  age. Return with
31a50 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f 2e  out further ado.
31a60 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
31a70 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58   pgno<=PAGER_MAX
31a80 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50  _PGNO && pgno!=P
31a90 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
31aa0 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61 67  ger) );.    pPag
31ab0 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
31ac0 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20  STAT_HIT]++;.   
31ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31ae0 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K;..  }else{.   
31af0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
31b00 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
31b10 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
31b20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
31b30 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
31b40 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20 20  ialized.  */..  
31b50 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b    pPg = *ppPage;
31b60 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
31b70 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
31b80 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
31b90 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
31ba0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
31bb0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
31bc0 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
31bd0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
31be0 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
31bf0 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
31c00 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
31c10 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
31c20 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
31c30 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
31c40 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
31c50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31c60 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
31c70 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
31c80 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
31c90 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d    }..    if( MEM
31ca0 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  DB || pPager->db
31cb0 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43  Size<pgno || noC
31cc0 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65  ontent || !isOpe
31cd0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
31ce0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
31cf0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
31d00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
31d10 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
31d20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
31d30 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
31d40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
31d50 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
31d60 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
31d70 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
31d80 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
31d90 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
31da0 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
31db0 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
31dc0 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
31dd0 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
31de0 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
31df0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
31e00 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
31e10 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
31e20 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
31e30 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
31e40 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
31e50 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
31e60 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
31e70 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
31e80 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
31e90 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
31ea0 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
31eb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
31ec0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
31ed0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
31ee0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
31ef0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
31f00 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
31f10 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
31f20 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
31f30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
31f40 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
31f50 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
31f60 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
31f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31f80 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
31f90 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
31fa0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
31fb0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
31fc0 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
31fd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
31fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
31ff0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
32000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
32010 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
32020 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
32030 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f  eSize);.      IO
32040 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
32050 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
32060 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
32070 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
32080 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
32090 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ger );.      pPa
320a0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
320b0 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20  _STAT_MISS]++;. 
320c0 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
320d0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
320e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
320f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
32100 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
32110 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
32120 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
32130 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  t_pagehash(pPg);
32140 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
32150 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72  QLITE_OK;..pager
32160 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20 20  _acquire_err:.  
32170 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
32180 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
32190 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Pg ){.    sqlite
321a0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
321b0 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c  ;.  }.  pagerUnl
321c0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
321d0 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67 65 20  er);..  *ppPage 
321e0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
321f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
32200 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
32210 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
32220 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
32230 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
32240 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
32250 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
32260 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
32270 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
32280 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
32290 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a   in cache. .**.*
322a0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
322b0 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
322c0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
322d0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
322e0 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
322f0 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
32300 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
32310 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
32320 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
32330 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
32340 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
32350 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
32360 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
32370 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
32380 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
32390 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
323a0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
323b0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
323c0 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
323d0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
323e0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
323f0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
32400 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
32410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
32420 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
32430 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
32440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
32450 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  ache!=0 );.  ass
32460 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32470 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
32480 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
32490 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
324a0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   );.  sqlite3Pca
324b0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
324c0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
324d0 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65 74 75  0, &pPg);.  retu
324e0 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
324f0 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 20   Release a page 
32500 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a  reference..**.**
32510 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
32520 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
32530 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
32540 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
32550 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
32560 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
32570 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
32580 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
32590 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
325a0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
325b0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
325c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
325d0 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
325e0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
325f0 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
32600 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
32610 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
32620 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
32630 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
32640 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
32650 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
32660 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
32670 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
32680 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
32690 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
326a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
326b0 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
326c0 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
326d0 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
326e0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
326f0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
32700 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
32710 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
32720 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
32730 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
32740 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
32750 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
32760 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
32770 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
32780 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
32790 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
327a0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
327b0 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
327c0 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
327d0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
327e0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
327f0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
32800 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
32810 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
32820 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
32830 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
32840 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
32850 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
32860 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
32870 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
32880 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
32890 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
328a0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
328b0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
328c0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
328d0 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
328e0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
328f0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
32900 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
32910 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
32920 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
32930 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
32940 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
32950 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
32960 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
32970 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
32980 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
32990 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
329a0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
329b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
329c0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
329d0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
329e0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
329f0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
32a00 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
32a10 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
32a20 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
32a30 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
32a40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
32a50 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
32a60 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
32a70 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
32a80 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
32a90 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
32aa0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
32ab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
32ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
32ae0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
32af0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
32b00 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
32b10 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
32b20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
32b30 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
32b40 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
32b50 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
32b60 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
32b70 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
32b80 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
32b90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32ba0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
32bb0 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
32bc0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
32bd0 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
32be0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
32bf0 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
32c00 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
32c10 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
32c20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
32c30 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
32c40 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
32c50 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
32c60 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
32c70 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
32c80 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
32c90 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65  de;..  if( !page
32ca0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32cb0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
32cc0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
32cd0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
32ce0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
32cf0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
32d00 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
32d10 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
32d20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
32d30 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
32d40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
32d50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
32d60 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .  .    /* Open 
32d70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
32d80 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
32d90 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
32da0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
32db0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
32dc0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
32dd0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
32de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32df0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
32e00 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
32e10 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
32e20 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  jfd);.      }els
32e30 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  e{.        const
32e40 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
32e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e60 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
32e70 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
32e80 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   */.#if SQLITE_E
32e90 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
32ea0 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  CTION.          
32eb0 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
32ec0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
32ed0 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
32ee0 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
32ef0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
32f00 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
32f10 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
32f20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
32f30 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20  ->tempFile ? .  
32f40 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
32f50 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
32f60 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
32f70 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
32f80 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
32f90 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
32fa0 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20  URNAL).         
32fb0 20 29 3b 0a 20 20 23 69 66 64 65 66 20 53 51 4c   );.  #ifdef SQL
32fc0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
32fd0 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
32fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
32ff0 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20  nalOpen(.       
33000 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
33010 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
33020 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
33030 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
33040 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20  pPager).        
33050 29 3b 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 20  );.  #else.     
33060 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
33070 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
33080 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
33090 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
330a0 2c 20 30 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20  , 0);.  #endif. 
330b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
330c0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
330d0 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61  OK || isOpen(pPa
330e0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20  ger->jfd) );.   
330f0 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20   }.  .  .    /* 
33100 57 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20  Write the first 
33110 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
33120 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
33130 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20  le and open .   
33140 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
33150 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
33160 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
33170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33180 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  {.      /* TODO:
33190 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66   Check if all of
331a0 20 74 68 65 73 65 20 61 72 65 20 72 65 61 6c 6c   these are reall
331b0 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  y required. */. 
331c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
331d0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  c = 0;.      pPa
331e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
331f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
33200 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
33210 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
33220 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
33230 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
33240 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
33250 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
33260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33270 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
33280 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
33290 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
332a0 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
332b0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
332c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
332d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
332e0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
332f0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
33300 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
33310 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
33320 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72  CHEMOD;.  }..  r
33330 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
33340 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
33350 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
33360 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
33370 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
33380 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
33390 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
333a0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
333b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
333c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
333d0 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
333e0 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
333f0 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
33400 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
33410 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
33420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
33430 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
33440 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
33450 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
33460 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
33470 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
33480 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
33490 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
334a0 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
334b0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
334c0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
334d0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  y argument is no
334e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  n-zero, then any
334f0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65   sub-journal ope
33500 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  ned.** within th
33510 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  is transaction w
33520 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 61 73  ill be opened as
33530 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
33540 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61 73 20  le. This.** has 
33550 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74 68 65  no effect if the
33560 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
33570 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 28  already opened (
33580 61 73 20 69 74 20 6d 61 79 20 62 65 20 77 68 65  as it may be whe
33590 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20  n.** running in 
335a0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 20  exclusive mode) 
335b0 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  or if the transa
335c0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72  ction does not r
335d0 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d  equire a.** sub-
335e0 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 65 20  journal. If the 
335f0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
33600 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74  ument is zero, t
33610 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65 64  hen any required
33620 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
33630 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69  is implemented i
33640 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50 61 67  n-memory if pPag
33650 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  er is an in-memo
33660 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a  ry database, .**
33670 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65 6d 70   or using a temp
33680 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68 65 72  orary file other
33690 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
336a0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 50  ite3PagerBegin(P
336b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
336c0 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20 73 75  t exFlag, int su
336d0 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69  bjInMemory){.  i
336e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
336f0 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  K;..  if( pPager
33700 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
33710 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
33720 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  de;.  assert( pP
33730 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
33740 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 70 50  GER_READER && pP
33750 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47  ager->eState<PAG
33760 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 70 50  ER_ERROR );.  pP
33770 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f  ager->subjInMemo
33780 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d  ry = (u8)subjInM
33790 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c  emory;..  if( AL
337a0 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65 53 74  WAYS(pPager->eSt
337b0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
337c0 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  R) ){.    assert
337d0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
337e0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  rnal==0 );..    
337f0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
33800 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
33810 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
33820 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74   is configured t
33830 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  o use locking_mo
33840 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20 61 6e  de=exclusive, an
33850 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78  d an.      ** ex
33860 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
33870 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
33880 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64  not already held
33890 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e  , obtain it now.
338a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
338b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
338c0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73 71 6c  usiveMode && sql
338d0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
338e0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
338f0 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  l, -1) ){.      
33900 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
33910 44 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  Db(pPager, EXCLU
33920 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
33930 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33950 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33970 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73  sqlite3WalExclus
33980 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e  iveMode(pPager->
33990 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20  pWal, 1);.      
339a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62  }..      /* Grab
339b0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
339c0 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  on the log file.
339d0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
339e0 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20  upgrade to.     
339f0 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56   ** PAGER_RESERV
33a00 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  ED state. Otherw
33a10 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  ise, return an e
33a20 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
33a30 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
33a40 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  * The busy-handl
33a50 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65  er is not invoke
33a60 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e  d if another con
33a70 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a  nection already.
33a80 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74        ** holds t
33a90 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49  he write-lock. I
33aa0 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
33ab0 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
33ac0 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20   call it..      
33ad0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
33ae0 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69  lite3WalBeginWri
33af0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
33b00 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
33b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
33b20 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
33b30 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
33b40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
33b50 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
33b60 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  meter.      ** i
33b70 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
33b80 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
33b90 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
33ba0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
33bb0 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61        ** busy-ha
33bc0 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63  ndler callback c
33bd0 61 6e 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  an be used when 
33be0 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65  upgrading to the
33bf0 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20   EXCLUSIVE.     
33c00 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
33c10 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
33c20 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
33c30 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ck..      */.   
33c40 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
33c50 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45  kDb(pPager, RESE
33c60 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
33c70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33c80 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b  _OK && exFlag ){
33c90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
33ca0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
33cb0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
33cc0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
33cd0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
33ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33cf0 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67  {.      /* Chang
33d00 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b  e to WRITER_LOCK
33d10 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  ED state..      
33d20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  **.      ** WAL 
33d30 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65 72 2e  mode sets Pager.
33d40 65 53 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f  eState to PAGER_
33d50 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72  WRITER_LOCKED or
33d60 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20   CACHEMOD.      
33d70 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 61  ** when it has a
33d80 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69  n open transacti
33d90 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f  on, but never to
33da0 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48   DBMOD or FINISH
33db0 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ED..      ** Thi
33dc0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
33dd0 74 68 6f 73 65 20 73 74 61 74 65 73 20 74 68 65  those states the
33de0 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61   code to roll ba
33df0 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  ck savepoint .  
33e00 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
33e10 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74  ons may copy dat
33e20 61 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  a from the sub-j
33e30 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
33e40 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 20 20  database .      
33e50 2a 2a 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20  ** file as well 
33e60 61 73 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  as into the page
33e70 20 63 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f   cache. Which wo
33e80 75 6c 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74  uld be incorrect
33e90 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41   in .      ** WA
33ea0 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  L mode..      */
33eb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
33ec0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
33ed0 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  ITER_LOCKED;.   
33ee0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
33ef0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
33f00 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
33f10 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
33f20 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
33f30 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
33f40 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50  >dbOrigSize = pP
33f50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
33f60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
33f70 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
33f80 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  }..    assert( r
33f90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
33fa0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33fb0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
33fc0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
33fd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
33fe0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
33ff0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
34000 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34010 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
34020 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
34030 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
34040 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
34050 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
34060 67 65 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ger)));.  return
34070 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
34080 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
34090 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
340a0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
340b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
340c0 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
340d0 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
340e0 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
340f0 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
34100 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
34110 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
34120 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
34130 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
34140 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
34150 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
34160 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
34170 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
34180 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
34190 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
341a0 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
341b0 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
341c0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
341d0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
341e0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
341f0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
34200 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
34210 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
34220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34230 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
34240 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
34250 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d   unless a write-
34260 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
34270 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65  already .  ** be
34280 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20  en started. The 
34290 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
342a0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
342b0 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
342c0 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  t..  ** It is ne
342d0 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68  ver called in th
342e0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20  e ERROR state.. 
342f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
34300 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
34310 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
34320 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
34330 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
34340 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
34350 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
34360 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
34370 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
34380 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
34390 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
343a0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
343b0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
343c0 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
343d0 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f  y detected, repo
343e0 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rt the same erro
343f0 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 20 54 68  r.  ** again. Th
34400 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  is should not ha
34410 70 70 65 6e 2c 20 62 75 74 20 74 68 65 20 63 68  ppen, but the ch
34420 65 63 6b 20 70 72 6f 76 69 64 65 73 20 72 6f 62  eck provides rob
34430 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
34440 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
34450 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75  errCode) )  retu
34460 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
34470 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72  de;..  /* Higher
34480 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20  -level routines 
34490 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20  never call this 
344a0 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61  function if data
344b0 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  base is not.  **
344c0 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20   writable.  But 
344d0 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75  check anyway, ju
344e0 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  st for robustnes
344f0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
34500 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  R(pPager->readOn
34510 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ly) ) return SQL
34520 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 43 48 45  ITE_PERM;..  CHE
34530 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
34540 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
34550 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
34560 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20   opened. Higher 
34570 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68  level routines h
34580 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
34590 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65   obtained the ne
345a0 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f  cessary locks to
345b0 20 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65   begin the write
345c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75  -transaction, bu
345d0 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62  t the.  ** rollb
345e0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ack journal migh
345f0 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65  t not yet be ope
34600 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69  n. Open it now i
34610 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
34620 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
34630 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
34640 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  e calling sqlite
34650 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
34660 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  () on the page. 
34670 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
34680 20 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65   if it were done
34690 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73   after calling s
346a0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
346b0 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20  Dirty(), then.  
346c0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68  ** an error migh
346d0 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20  t occur and the 
346e0 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20  pager would end 
346f0 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43  up in WRITER_LOC
34700 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77  KED state.  ** w
34710 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64  ith pages marked
34720 20 61 73 20 64 69 72 74 79 20 69 6e 20 74 68 65   as dirty in the
34730 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69   cache..  */.  i
34740 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
34750 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
34760 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63  LOCKED ){.    rc
34770 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
34780 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
34790 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
347a0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
347b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
347c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
347d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
347e0 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  HEMOD );.  asser
347f0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
34800 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
34810 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
34820 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
34830 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
34840 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
34850 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
34860 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
34870 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
34880 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
34890 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
348a0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
348b0 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
348c0 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
348d0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
348e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
348f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
34900 72 29 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  r) );.  }else{. 
34910 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
34920 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
34930 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
34940 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
34950 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
34960 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
34970 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
34980 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
34990 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
349a0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
349b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
349c0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
349d0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
349e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
349f0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
34a00 67 29 20 26 26 20 21 70 61 67 65 72 55 73 65 57  g) && !pagerUseW
34a10 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
34a20 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
34a30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
34a40 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
34a50 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
34a60 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 26 26  r->dbOrigSize &&
34a70 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
34a80 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
34a90 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
34aa0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
34ab0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66  .        i64 iOf
34ac0 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
34ad0 6e 61 6c 4f 66 66 3b 0a 0a 20 20 20 20 20 20 20  nalOff;..       
34ae0 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
34af0 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
34b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
34b10 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20  e page that.    
34b20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
34b30 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
34b40 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
34b50 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
34b60 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
34b70 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
34b80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34b90 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
34ba0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
34bb0 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  ) );..        as
34bc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
34bd0 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72  urnalHdr<=pPager
34be0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
34bf0 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70          CODEC2(p
34c00 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
34c10 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
34c20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
34c30 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
34c40 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
34c50 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
34c60 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 20  8*)pData2);..   
34c70 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
34c80 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
34c90 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  l error occurs w
34ca0 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
34cb0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
34cc0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
34cd0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
34ce0 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
34cf0 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
34d00 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
34d10 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
34d20 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
34d30 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
34d40 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
34d50 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
34d60 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
34d70 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
34d80 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
34d90 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
34da0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
34db0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
34dc0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
34dd0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
34de0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
34df0 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
34e00 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
34e10 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
34e20 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
34e30 5f 53 59 4e 43 3b 0a 0a 20 20 20 20 20 20 20 20  _SYNC;..        
34e40 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
34e50 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
34e60 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
34e70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34e80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
34e90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72  rn rc;.        r
34ea0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
34eb0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
34ec0 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
34ed0 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34  pageSize, iOff+4
34ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34ef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
34f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34f10 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
34f20 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
34f30 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
34f40 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
34f50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
34f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
34f70 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
34f80 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
34f90 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
34fa0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
34fb0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
34fc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
34fd0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
34fe0 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
34ff0 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
35000 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
35010 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
35020 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
35030 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
35040 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
35050 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
35060 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
35070 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
35080 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
35090 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
350a0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
350b0 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
350c0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
350d0 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 70 50 61  ));..        pPa
350e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
350f0 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70  += 8 + pPager->p
35100 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
35110 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
35120 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
35130 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35140 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
35150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
35160 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
35170 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
35180 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
35190 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
351a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
351b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
351c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
351d0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
351e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d  );.        rc |=
351f0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
35200 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
35210 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
35220 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
35230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35240 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
35250 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
35260 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
35270 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
35280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35290 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
352a0 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
352b0 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20 20 20  ER_DBMOD ){.    
352c0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
352d0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
352e0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  YNC;.        }. 
352f0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
35300 45 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61  E(("APPEND %d pa
35310 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
35320 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
35330 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
35340 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
35350 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35360 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
35370 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
35380 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  :0)));.      }. 
35390 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
353a0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
353b0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
353c0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
353d0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
353e0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
353f0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
35400 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
35410 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
35420 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
35430 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
35440 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
35450 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
35460 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
35470 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
35480 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
35490 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
354a0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
354b0 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
354c0 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
354d0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
354e0 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
354f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
35500 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
35510 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
35520 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
35530 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
35540 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
35550 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
35560 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
35570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35580 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
35590 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
355a0 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
355b0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
355c0 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67  efore .** making
355d0 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
355e0 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ge. The caller m
355f0 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
35600 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  turn value .** o
35610 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
35620 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
35630 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79  ot to change any
35640 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73   page data unles
35650 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  s .** this routi
35660 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
35670 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
35680 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
35690 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
356a0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
356b0 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
356c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
356d0 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
356e0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
356f0 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
35700 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
35710 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
35720 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
35730 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
35740 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
35750 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
35760 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
35770 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
35780 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
35790 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
357a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
357b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
357c0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
357d0 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
357e0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
357f0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
35800 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
35810 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
35820 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
35830 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
35840 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
35850 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
35860 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
35870 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
35880 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
35890 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
358a0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
358b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
358c0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
358d0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
358e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
358f0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
35900 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
35910 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35920 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35930 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
35940 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
35950 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
35960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
35970 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
35980 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
35990 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
359a0 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
359b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
359c0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
359d0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
359e0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
359f0 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
35a00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35a10 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
35a20 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
35a30 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
35a40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35a50 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
35a60 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
35a70 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
35a80 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
35a90 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48  any page has PGH
35aa0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a  DR_NEED_SYNC */.
35ab0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
35ac0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66  doNotSyncSpill f
35ad0 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
35ae0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
35af0 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a  not allow.    **
35b00 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
35b10 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
35b20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
35b30 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20  s journaled by. 
35b40 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
35b50 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
35b60 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
35b70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
35b80 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
35b90 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pill==0 );.    p
35ba0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
35bb0 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  Spill++;..    /*
35bc0 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
35bd0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
35be0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
35bf0 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
35c00 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
35c10 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
35c20 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
35c30 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
35c40 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
35c50 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
35c60 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
35c70 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
35c80 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
35c90 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
35ca0 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
35cb0 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
35cc0 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61  nPageCount = pPa
35cd0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
35ce0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
35cf0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
35d00 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
35d10 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
35d20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
35d30 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
35d40 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
35d50 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
35d60 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
35d70 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
35d80 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
35d90 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
35da0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
35db0 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
35dc0 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
35dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
35de0 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
35df0 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
35e00 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
35e10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
35e20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
35e30 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
35e40 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
35e50 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
35e60 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
35e70 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
35e80 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
35e90 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
35ea0 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
35eb0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
35ec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
35ed0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35ee0 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
35ef0 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
35f00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35f10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
35f20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
35f30 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
35f40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
35f50 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
35f60 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
35f70 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
35f80 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
35f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35fa0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
35fb0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
35fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35fd0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
35fe0 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
35ff0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
36000 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
36010 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
36020 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
36030 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
36040 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
36050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36060 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36070 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
36080 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
36090 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e  * If the PGHDR_N
360a0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
360b0 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
360c0 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
360d0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
360e0 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
360f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
36100 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
36110 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
36120 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
36130 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
36140 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
36150 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
36160 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
36170 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
36180 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
36190 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
361a0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
361b0 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
361c0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
361d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
361e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
361f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36200 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  && needSync ){. 
36210 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
36220 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  MDB );.      for
36230 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b  (ii=0; ii<nPage;
36240 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
36250 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
36260 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
36270 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
36280 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
36290 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
362a0 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
362b0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
362c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
362d0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
362e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
362f0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
36300 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
36310 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20  NotSyncSpill==1 
36320 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
36330 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b  oNotSyncSpill--;
36340 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
36350 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
36360 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
36370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36380 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
36390 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
363a0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
363b0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
363c0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
363d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
363e0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
363f0 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
36400 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
36410 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
36420 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
36430 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
36440 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
36450 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
36460 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
36470 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
36480 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
36490 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
364a0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
364b0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
364c0 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
364d0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
364e0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
364f0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
36500 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
36510 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
36520 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
36530 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
36540 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
36550 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
36560 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
36570 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
36580 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
36590 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
365a0 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
365b0 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
365c0 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
365d0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
365e0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
365f0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
36600 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
36610 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
36620 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
36630 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d  sed. The pager m
36640 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
36650 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
36660 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
36670 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
36680 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
36690 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
366a0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71  timization can q
366b0 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
366c0 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20  ed of large .** 
366d0 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
366e0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
366f0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
36700 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
36710 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
36720 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
36730 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
36740 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
36750 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
36760 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45  t==0 ){.    PAGE
36770 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52  RTRACE(("DONT_WR
36780 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
36790 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
367a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
367b0 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
367c0 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
367d0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
367e0 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66  gno)).    pPg->f
367f0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
36800 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70 61  NT_WRITE;.    pa
36810 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
36820 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  (pPg);.  }.}../*
36830 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
36840 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
36850 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
36860 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
36870 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67  e file .** chang
36880 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65  e-counter, store
36890 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69  d as a 4-byte bi
368a0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
368b0 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a   starting at .**
368c0 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
368d0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
368e0 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61 72  e.  The secondar
368f0 79 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  y change counter
36900 20 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c 73   at.** 92 is als
36910 6f 20 75 70 64 61 74 65 64 2c 20 61 73 20 69 73  o updated, as is
36920 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
36930 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
36940 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42  fset 96..**.** B
36950 75 74 20 74 68 69 73 20 6f 6e 6c 79 20 68 61 70  ut this only hap
36960 70 65 6e 73 20 69 66 20 74 68 65 20 70 50 61 67  pens if the pPag
36970 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
36980 6f 6e 65 20 66 6c 61 67 20 69 73 20 66 61 6c 73  one flag is fals
36990 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 65  e..** To avoid e
369a0 78 63 65 73 73 20 63 68 75 72 6e 69 6e 67 20 6f  xcess churning o
369b0 66 20 70 61 67 65 20 31 2c 20 74 68 65 20 75 70  f page 1, the up
369c0 64 61 74 65 20 6f 6e 6c 79 20 68 61 70 70 65 6e  date only happen
369d0 73 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20 61  s once..** See a
369e0 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 77 72  lso the pager_wr
369f0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
36a00 72 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74  r() routine that
36a10 20 64 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e 63   does an .** unc
36a20 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
36a30 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20  e of the change 
36a40 63 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  counters..**.** 
36a50 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  If the isDirectM
36a60 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f  ode flag is zero
36a70 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64  , then this is d
36a80 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a  one by calling .
36a90 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
36aa0 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31  rite() on page 1
36ab0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  , then modifying
36ac0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
36ad0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
36ae0 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
36af0 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  the file will be
36b00 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68   updated when th
36b10 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
36b20 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
36b30 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
36b40 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
36b50 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e  ag may only be n
36b60 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
36b70 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
36b80 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  led.** with the 
36b90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
36ba0 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f  OMIC_WRITE macro
36bb0 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69   defined. In thi
36bc0 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73  s case,.** if is
36bd0 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65  Direct is non-ze
36be0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ro, then the dat
36bf0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70  abase file is up
36c00 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a  dated directly.*
36c10 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20  * by writing an 
36c20 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20  updated version 
36c30 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20  of page 1 using 
36c40 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a  a call to the .*
36c50 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  * sqlite3OsWrite
36c60 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
36c70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
36c80 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
36c90 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
36ca0 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d  r, int isDirectM
36cb0 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ode){.  int rc =
36cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
36cd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36ce0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36cf0 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
36d00 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
36d10 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36d20 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
36d30 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
36d40 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
36d50 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 63  er) );..  /* Dec
36d60 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  lare and initial
36d70 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  ize constant int
36d80 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e  eger 'isDirect'.
36d90 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f   If the.  ** ato
36da0 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
36db0 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  zation is enable
36dc0 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
36dd0 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20   then isDirect. 
36de0 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   ** is initializ
36df0 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
36e00 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73  passed as the is
36e10 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d  DirectMode param
36e20 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69  eter.  ** to thi
36e30 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  s function. Othe
36e40 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77  rwise, it is alw
36e50 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
36e60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
36e70 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74  dea is that if t
36e80 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
36e90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
36ea0 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64  not.  ** enabled
36eb0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
36ec0 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  , the compiler c
36ed0 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74  an omit the test
36ee0 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72  s of.  ** 'isDir
36ef0 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77  ect' below, as w
36f00 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b  ell as the block
36f10 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65   enclosed in the
36f20 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72  .  ** "if( isDir
36f30 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e  ect )" condition
36f40 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
36f50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
36f60 4d 49 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69  MIC_WRITE.# defi
36f70 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30  ne DIRECT_MODE 0
36f80 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72  .  assert( isDir
36f90 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ectMode==0 );.  
36fa0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
36fb0 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a  (isDirectMode);.
36fc0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44  #else.# define D
36fd0 49 52 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72  IRECT_MODE isDir
36fe0 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a  ectMode.#endif..
36ff0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
37000 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26  hangeCountDone &
37010 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
37020 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  >0 ){.    PgHdr 
37030 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20  *pPgHdr;        
37040 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
37050 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
37060 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
37070 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
37080 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
37090 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f  r->fd) );..    /
370a0 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
370b0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
370c0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
370d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
370e0 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
370f0 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65  PgHdr);.    asse
37100 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c  rt( pPgHdr==0 ||
37110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37120 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67  ;..    /* If pag
37130 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65  e one was fetche
37140 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
37150 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
37160 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  n is not.    ** 
37170 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72  operating in dir
37180 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70  ect-mode, make p
37190 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 20  age 1 writable. 
371a0 20 57 68 65 6e 20 6e 6f 74 20 69 6e 20 0a 20 20   When not in .  
371b0 20 20 2a 2a 20 64 69 72 65 63 74 20 6d 6f 64 65    ** direct mode
371c0 2c 20 70 61 67 65 20 31 20 69 73 20 61 6c 77 61  , page 1 is alwa
371d0 79 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  ys held in cache
371e0 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 50   and hence the P
371f0 61 67 65 72 47 65 74 28 29 0a 20 20 20 20 2a 2a  agerGet().    **
37200 20 61 62 6f 76 65 20 69 73 20 61 6c 77 61 79 73   above is always
37210 20 73 75 63 63 65 73 73 66 75 6c 20 2d 20 68 65   successful - he
37220 6e 63 65 20 74 68 65 20 41 4c 57 41 59 53 20 6f  nce the ALWAYS o
37230 6e 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e  n rc==SQLITE_OK.
37240 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
37250 21 44 49 52 45 43 54 5f 4d 4f 44 45 20 26 26 20  !DIRECT_MODE && 
37260 41 4c 57 41 59 53 28 72 63 3d 3d 53 51 4c 49 54  ALWAYS(rc==SQLIT
37270 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 72  E_OK) ){.      r
37280 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37290 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20  Write(pPgHdr);. 
372a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
372b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
372c0 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 6c 79       /* Actually
372d0 20 64 6f 20 74 68 65 20 75 70 64 61 74 65 20 6f   do the update o
372e0 66 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  f the change cou
372f0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 61  nter */.      pa
37300 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
37310 63 6f 75 6e 74 65 72 28 70 50 67 48 64 72 29 3b  counter(pPgHdr);
37320 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75  ..      /* If ru
37330 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20  nning in direct 
37340 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
37350 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
37360 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   1 to the file. 
37370 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 44 49 52  */.      if( DIR
37380 45 43 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20  ECT_MODE ){.    
37390 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
373a0 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 61 73  zBuf;.        as
373b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
373c0 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20  FileSize>0 );.  
373d0 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
373e0 67 65 72 2c 20 70 50 67 48 64 72 2d 3e 70 44 61  ger, pPgHdr->pDa
373f0 74 61 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51 4c  ta, 1, 6, rc=SQL
37400 49 54 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29  ITE_NOMEM, zBuf)
37410 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37420 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37430 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
37440 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
37450 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
37460 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
37470 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
37480 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
37490 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b  ER_STAT_WRITE]++
374a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
374b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
374c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
374d0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
374e0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
374f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37500 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
37510 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
37520 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ntDone = 1;.    
37530 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
37540 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
37550 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
37560 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
37570 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
37580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
375a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
375b0 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69   to disk. This i
375c0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e  s a no-op for in
375d0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
375e0 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69  s.** or pages wi
375f0 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  th the Pager.noS
37600 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ync flag set..**
37610 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
37620 6c 2c 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20  l, or if called 
37630 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77  on a pager for w
37640 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d  hich it is a no-
37650 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  op, this.** func
37660 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
37670 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
37680 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  e, an IO error c
37690 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
376a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
376b0 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
376c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
376d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
376e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
376f0 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
37700 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
37710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
37720 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
37730 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
37740 67 73 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  gs);.  }else if(
37750 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
37760 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  fd) ){.    asser
37770 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
37780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
37790 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
377a0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
377b0 4e 54 4c 5f 53 59 4e 43 5f 4f 4d 49 54 54 45 44  NTL_SYNC_OMITTED
377c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
377d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
377e0 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
377f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
37800 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
37820 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c  function may onl
37830 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c  y be called whil
37840 65 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  e a write-transa
37850 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
37860 69 6e 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 20  in.** rollback. 
37870 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
37880 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  n is in WAL mode
37890 2c 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  , this call is a
378a0 20 6e 6f 2d 6f 70 2e 20 0a 2a 2a 20 4f 74 68 65   no-op. .** Othe
378b0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 6f  rwise, if the co
378c0 6e 6e 65 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nnection does no
378d0 74 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  t already have a
378e0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
378f0 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61   on .** the data
37900 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 74  base file, an at
37910 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
37920 20 6f 62 74 61 69 6e 20 6f 6e 65 2e 0a 2a 2a 0a   obtain one..**.
37930 2a 2a 20 49 66 20 74 68 65 20 45 58 43 4c 55 53  ** If the EXCLUS
37940 49 56 45 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  IVE lock is alre
37950 61 64 79 20 68 65 6c 64 20 6f 72 20 74 68 65 20  ady held or the 
37960 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
37970 6e 20 69 74 20 69 73 0a 2a 2a 20 73 75 63 63 65  n it is.** succe
37980 73 73 66 75 6c 2c 20 6f 72 20 74 68 65 20 63 6f  ssful, or the co
37990 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 57  nnection is in W
379a0 41 4c 20 6d 6f 64 65 2c 20 53 51 4c 49 54 45 5f  AL mode, SQLITE_
379b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
379c0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 65 69  ** Otherwise, ei
379d0 74 68 65 72 20 53 51 4c 49 54 45 5f 42 55 53 59  ther SQLITE_BUSY
379e0 20 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f   or an SQLITE_IO
379f0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
37a00 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
37a10 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
37a20 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
37a30 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
37a40 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
37a50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
37a60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
37a70 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37a80 52 5f 43 41 43 48 45 4d 4f 44 20 0a 20 20 20 20  R_CACHEMOD .    
37a90 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37aa0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
37ab0 45 52 5f 44 42 4d 4f 44 20 0a 20 20 20 20 20 20  ER_DBMOD .      
37ac0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
37ad0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
37ae0 5f 4c 4f 43 4b 45 44 20 0a 20 20 29 3b 0a 20 20  _LOCKED .  );.  
37af0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37b00 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37b10 72 29 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 70  r) );.  if( 0==p
37b20 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
37b30 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  r) ){.    rc = p
37b40 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
37b50 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
37b60 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20  IVE_LOCK);.  }. 
37b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37b80 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
37b90 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
37ba0 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
37bb0 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
37bc0 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
37bd0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
37be0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
37bf0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
37c00 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
37c10 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
37c20 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
37c30 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
37c40 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
37c50 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
37c60 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
37c70 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
37c80 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
37c90 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
37ca0 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
37cb0 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
37cc0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
37cd0 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
37ce0 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
37cf0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
37d00 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
37d10 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
37d20 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
37d30 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
37d40 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
37d50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
37d60 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
37d70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37d80 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
37d90 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
37da0 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
37db0 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
37dc0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
37dd0 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
37de0 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
37df0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
37e00 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
37e10 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
37e20 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
37e30 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
37e40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
37e50 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
37e60 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
37e70 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
37e80 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
37e90 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
37ea0 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
37eb0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
37ec0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
37ed0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
37ee0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
37ef0 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
37f00 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
37f10 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
37f20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
37f30 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
37f40 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
37f50 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
37f60 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
37f70 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
37f80 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
37f90 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
37fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37fb0 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
37fc0 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
37fd0 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
37fe0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
37ff0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
38000 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
38010 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
38020 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
38030 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
38040 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
38050 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
38060 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
38070 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
38080 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
38090 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
380a0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
380b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
380c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
380d0 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
380e0 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
380f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
38100 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
38110 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
38120 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  code */..  asser
38130 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
38140 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38150 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
38160 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
38170 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
38180 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
38190 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
381a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
381b0 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
381c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
381d0 47 45 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 20  GER_ERROR.  );. 
381e0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
381f0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
38200 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
38210 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 6f 63  a prior error oc
38220 63 75 72 72 65 64 2c 20 72 65 70 6f 72 74 20 74  curred, report t
38230 68 61 74 20 65 72 72 6f 72 20 61 67 61 69 6e 2e  hat error again.
38240 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
38250 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
38260 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
38270 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 50 41  ->errCode;..  PA
38280 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
38290 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
382a0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
382b0 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
382c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
382d0 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
382e0 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
382f0 20 20 2f 2a 20 49 66 20 6e 6f 20 64 61 74 61 62    /* If no datab
38300 61 73 65 20 63 68 61 6e 67 65 73 20 68 61 76 65  ase changes have
38310 20 62 65 65 6e 20 6d 61 64 65 2c 20 72 65 74 75   been made, retu
38320 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69  rn early. */.  i
38330 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
38340 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  e<PAGER_WRITER_C
38350 41 43 48 45 4d 4f 44 20 29 20 72 65 74 75 72 6e  ACHEMOD ) return
38360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
38370 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
38380 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
38390 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
383a0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
383b0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
383c0 20 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   or this.    ** 
383d0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
383e0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
383f0 2c 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61  , it is mostly a
38400 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72   no-op.  However
38410 2c 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63  , any.    ** bac
38420 6b 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20  kup in progress 
38430 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
38440 61 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  arted..    */.  
38450 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
38460 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
38470 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65  Backup);.  }else
38480 7b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  {.    if( pagerU
38490 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
384a0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 4c  .      PgHdr *pL
384b0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
384c0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
384d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
384e0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
384f0 65 4f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  eOne = 0;.      
38500 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
38510 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
38520 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
38530 65 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 57  e page for the W
38540 41 4c 20 63 6f 6d 6d 69 74 20 66 6c 61 67 2e 0a  AL commit flag..
38550 20 20 20 20 20 20 20 20 2a 2a 20 54 69 63 6b 65          ** Ticke
38560 74 20 5b 32 64 31 61 35 63 36 37 64 66 63 32 33  t [2d1a5c67dfc23
38570 36 33 65 34 34 66 32 39 64 39 62 62 64 35 37 66  63e44f29d9bbd57f
38580 5d 20 32 30 31 31 2d 30 35 2d 31 38 20 2a 2f 0a  ] 2011-05-18 */.
38590 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
385a0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
385b0 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 4f 6e  ger, 1, &pPageOn
385c0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  e);.        pLis
385d0 74 20 3d 20 70 50 61 67 65 4f 6e 65 3b 0a 20 20  t = pPageOne;.  
385e0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 44 69        pList->pDi
385f0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  rty = 0;.      }
38600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
38610 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
38620 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
38630 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
38640 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
38650 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
38660 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62  List, pPager->db
38670 53 69 7a 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  Size, 1);.      
38680 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
38690 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 4f  agerUnref(pPageO
386a0 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ne);.      if( r
386b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
386c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
386d0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
386e0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
386f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
38700 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54