/ Hex Artifact Content
Login

Artifact 5545863e4e246e1744cfb6993821c6e4b63ffb64:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20  Readlock;       
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69   bother to obtai
7100: 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20  n readlocks */. 
7110: 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20   u8 noSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  Do not sync the 
7140: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20  journal if true 
7150: 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63  */.  u8 fullSync
7160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7170: 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e   /* Do extra syn
7180: 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  cs of the journa
7190: 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73  l for robustness
71a0: 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79 6e   */.  u8 ckptSyn
71b0: 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  cFlags;         
71c0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
71d0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f   or SYNC_FULL fo
71e0: 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a  r checkpoint */.
71f0: 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73 3b 20    u8 syncFlags; 
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7210: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
7220: 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77  SYNC_FULL otherw
7230: 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ise */.  u8 temp
7240: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
7250: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
7260: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
7270: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
7280: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
7290: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
72a0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
72b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
72c0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
72d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72e0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
72f0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
7300: 20 68 61 73 53 65 65 6e 53 74 72 65 73 73 3b 20   hasSeenStress; 
7310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
7320: 65 72 53 74 72 65 73 73 28 29 20 63 61 6c 6c 65  erStress() calle
7330: 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 69  d one or more ti
7340: 6d 65 73 20 2a 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a  mes */..  /*****
7350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7390: 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  *****.  ** The f
73a0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63  ollowing block c
73b0: 6f 6e 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c  ontains those cl
73c0: 61 73 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74  ass members that
73d0: 20 63 68 61 6e 67 65 20 64 75 72 69 6e 67 0a 20   change during. 
73e0: 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6f 70 65 72   ** routine oper
73f0: 74 69 6f 6e 2e 20 20 43 6c 61 73 73 20 6d 65 6d  tion.  Class mem
7400: 62 65 72 73 20 6e 6f 74 20 69 6e 20 74 68 69 73  bers not in this
7410: 20 62 6c 6f 63 6b 20 61 72 65 20 65 69 74 68 65   block are eithe
7420: 72 20 66 69 78 65 64 0a 20 20 2a 2a 20 77 68 65  r fixed.  ** whe
7430: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 66  n the pager is f
7440: 69 72 73 74 20 63 72 65 61 74 65 64 20 6f 72 20  irst created or 
7450: 65 6c 73 65 20 6f 6e 6c 79 20 63 68 61 6e 67 65  else only change
7460: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
7470: 0a 20 20 2a 2a 20 73 69 67 6e 69 66 69 63 61 6e  .  ** significan
7480: 74 20 6d 6f 64 65 20 63 68 61 6e 67 65 20 28 73  t mode change (s
7490: 75 63 68 20 61 73 20 63 68 61 6e 67 69 6e 67 20  uch as changing 
74a0: 74 68 65 20 70 61 67 65 5f 73 69 7a 65 2c 20 6c  the page_size, l
74b0: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a  ocking_mode,.  *
74c0: 2a 20 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * or the journal
74d0: 5f 6d 6f 64 65 29 2e 20 20 46 72 6f 6d 20 61 6e  _mode).  From an
74e0: 6f 74 68 65 72 20 76 69 65 77 2c 20 74 68 65 73  other view, thes
74f0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
7500: 64 65 73 63 72 69 62 65 0a 20 20 2a 2a 20 74 68  describe.  ** th
7510: 65 20 22 73 74 61 74 65 22 20 6f 66 20 74 68 65  e "state" of the
7520: 20 70 61 67 65 72 2c 20 77 68 69 6c 65 20 6f 74   pager, while ot
7530: 68 65 72 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  her class member
7540: 73 20 64 65 73 63 72 69 62 65 20 74 68 65 0a 20  s describe the. 
7550: 20 2a 2a 20 22 63 6f 6e 66 69 67 75 72 61 74 69   ** "configurati
7560: 6f 6e 22 20 6f 66 20 74 68 65 20 70 61 67 65 72  on" of the pager
7570: 2e 0a 20 20 2a 2f 0a 20 20 75 38 20 65 53 74 61  ..  */.  u8 eSta
7580: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
7590: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74       /* Pager st
75a0: 61 74 65 20 28 4f 50 45 4e 2c 20 52 45 41 44 45  ate (OPEN, READE
75b0: 52 2c 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  R, WRITER_LOCKED
75c0: 2e 2e 29 20 2a 2f 0a 20 20 75 38 20 65 4c 6f 63  ..) */.  u8 eLoc
75d0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
75e0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
75f0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 64 61 74  lock held on dat
7600: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7610: 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  u8 changeCountDo
7620: 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ne;         /* S
7630: 65 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65  et after increme
7640: 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  nting the change
7650: 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38  -counter */.  u8
7660: 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20   setMaster;     
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7680: 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20  e if a m-j name 
7690: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
76a0: 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38   to jrnl */.  u8
76b0: 20 64 6f 4e 6f 74 53 70 69 6c 6c 3b 20 20 20 20   doNotSpill;    
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63 61  not spill the ca
76e0: 63 68 65 20 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72  che when non-zer
76f0: 6f 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53  o */.  u8 doNotS
7700: 79 6e 63 53 70 69 6c 6c 3b 20 20 20 20 20 20 20  yncSpill;       
7710: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 6f 20     /* Do not do 
7720: 61 20 73 70 69 6c 6c 20 74 68 61 74 20 72 65 71  a spill that req
7730: 75 69 72 65 73 20 6a 72 6e 6c 20 73 79 6e 63 20  uires jrnl sync 
7740: 2a 2f 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65  */.  u8 subjInMe
7750: 6d 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  mory;           
7760: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7770: 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
7780: 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f  urnals */.  Pgno
7790: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
77a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
77b0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
77c0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
77d0: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
77f0: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
7800: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
7810: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
7820: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
7830: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7840: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
7850: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7860: 0a 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69  .  Pgno dbHintSi
7870: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
7880: 2a 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74  * Value passed t
7890: 6f 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  o FCNTL_SIZE_HIN
78a0: 54 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  T call */.  int 
78b0: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
78c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
78d0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
78e0: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
78f0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
7900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7910: 67 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73  ges journalled s
7920: 69 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64  ince last j-head
7930: 65 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  er written */.  
7940: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
7950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
7960: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
7970: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
7980: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75   checksum */.  u
7990: 33 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20  32 nSubRec;     
79a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
79b0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
79c0: 77 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a  written to sub-j
79d0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76  ournal */.  Bitv
79e0: 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20  ec *pInJournal; 
79f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
7a00: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
7a10: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7a20: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
7a30: 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20  e3_file *fd;    
7a40: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7a50: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61  escriptor for da
7a60: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
7a70: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
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 6d  descriptor for m
7aa0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
7ab0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73   sqlite3_file *s
7ac0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  jfd;         /* 
7ad0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7ae0: 66 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  for sub-journal 
7af0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
7b00: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
7b10: 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74   /* Current writ
7b20: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
7b30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
7b40: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
7b50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7b60: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
7b70: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
7b80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c   header */.  sql
7b90: 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61  ite3_backup *pBa
7ba0: 63 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  ckup;    /* Poin
7bb0: 74 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f  ter to list of o
7bc0: 6e 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72  ngoing backup pr
7bd0: 6f 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67  ocesses */.  Pag
7be0: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61  erSavepoint *aSa
7bf0: 76 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61  vepoint; /* Arra
7c00: 79 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65  y of active save
7c10: 70 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20  points */.  int 
7c20: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20  nSavepoint;     
7c30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7c40: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  r of elements in
7c50: 20 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f   aSavepoint[] */
7c60: 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65  .  char dbFileVe
7c70: 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f  rs[16];        /
7c80: 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76  * Changes whenev
7c90: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
7ca0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 2f 2a   changes */.  /*
7cb0: 0a 20 20 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  .  ** End of the
7cc0: 20 72 6f 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67   routinely-chang
7cd0: 69 6e 67 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ing class member
7ce0: 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s.  ************
7cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
7d30: 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20  ..  u16 nExtra; 
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
7d60: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
7d70: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
7d80: 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b  .  i16 nReserve;
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7da0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
7db0: 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20  ed bytes at end 
7dc0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  of each page */.
7dd0: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7df0: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
7e00: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
7e10: 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69  /.  u32 sectorSi
7e20: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7e30: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
7e40: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
7e50: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  llback */.  int 
7e60: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
7e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7e80: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
7e90: 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  page */.  Pgno m
7ea0: 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  xPgno;          
7eb0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
7ec0: 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66   allowed size of
7ed0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
7ee0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
7ef0: 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 2f  zeLimit;       /
7f00: 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72  * Size limit for
7f10: 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
7f20: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63  nal files */.  c
7f30: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
7f40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
7f50: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
7f60: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
7f70: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
7f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
7f90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7fa0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  file */.  int (*
7fb0: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
7fc0: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
7fd0: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
7fe0: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
7ff0: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
8000: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
8010: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
8020: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66  syHandler */.#if
8030: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
8040: 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73    int nHit, nMis
8050: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
8060: 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20   Cache hits and 
8070: 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  missing */.  int
8080: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
8090: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
80a0: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
80b0: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
80c0: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
80d0: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
80e0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
80f0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
8100: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
8110: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
8120: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
8130: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8140: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8150: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8160: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8170: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8180: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8190: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
81a0: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
81b0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
81c0: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
81d0: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
81e0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
81f0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
8200: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
8210: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
8220: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
8230: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8240: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8250: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8260: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8270: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8280: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8290: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
82a0: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
82b0: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
82c0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
82d0: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
82e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
82f0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
8300: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
8310: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
8320: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
8330: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8340: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8350: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8360: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8370: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8380: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8390: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f.};../*.** The 
83a0: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
83b0: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
83c0: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
83d0: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
83e0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
83f0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
8400: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
8410: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
8420: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
8430: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
8440: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
8450: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8460: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8470: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
8480: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8490: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
84a0: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
84b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
84c0: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
84d0: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
84e0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
84f0: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
8500: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8510: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
8520: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
8530: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
8540: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
8550: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
8560: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
8570: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
8580: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
8590: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
85a0: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
85b0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
85c0: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
85d0: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
85e0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
85f0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
8600: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
8610: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
8620: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
8630: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
8640: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
8650: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
8660: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
8670: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
8680: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
8690: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
86a0: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
86b0: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
86c0: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
86d0: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
86e0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
86f0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
8700: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
8710: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
8720: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
8730: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
8740: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
8750: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
8760: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
8770: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
8780: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
8790: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
87a0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
87b0: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
87c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
87d0: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
87e0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
87f0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
8800: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
8810: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
8820: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
8830: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
8840: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
8850: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
8860: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
8870: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
8880: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
8890: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
88a0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
88b0: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
88c0: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
88d0: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
88e0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
88f0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
8900: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
8910: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
8920: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
8930: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
8940: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
8950: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
8960: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
8970: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
8980: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
8990: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
89a0: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
89b0: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
89c0: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
89d0: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
89e0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
89f0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
8a00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
8a10: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
8a20: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
8a30: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
8a40: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
8a50: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
8a60: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
8a70: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
8a80: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
8a90: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
8aa0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
8ab0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
8ac0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
8ad0: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
8ae0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
8af0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
8b00: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
8b10: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
8b20: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
8b30: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
8b40: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
8b50: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
8b60: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
8b70: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
8b80: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
8b90: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
8ba0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
8bb0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
8bc0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
8bd0: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
8be0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
8bf0: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
8c00: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
8c10: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
8c20: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
8c30: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
8c40: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
8c50: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
8c60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
8c70: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
8c80: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
8c90: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
8ca0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
8cb0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
8cc0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
8cd0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
8ce0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
8cf0: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
8d00: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
8d10: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
8d20: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
8d30: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
8d40: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
8d50: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
8d60: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
8d70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
8d80: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
8d90: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
8da0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
8db0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
8dc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
8dd0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
8de0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
8df0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
8e00: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
8e10: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
8e20: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
8e30: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
8e40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8e50: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
8e60: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
8e70: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
8e80: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
8e90: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
8ea0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
8eb0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
8ec0: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
8ed0: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
8ee0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
8ef0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
8f00: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
8f10: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
8f20: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
8f30: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
8f40: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
8f50: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
8f60: 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  hods)../*.** Ret
8f70: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
8f80: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
8f90: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
8fa0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
8fb0: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
8fc0: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
8fd0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
8fe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8ff0: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
9000: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
9010: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
9020: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
9030: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
9040: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9050: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
9060: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
9070: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9080: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
9090: 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 20 64  v,w,x,y,z) 0.# d
90a0: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
90b0: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
90c0: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
90d0: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
90e0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
90f0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
9100: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
9110: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
9120: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
9130: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
9140: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
9150: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9160: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9170: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9180: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9190: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
91a0: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
91b0: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
91c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
91d0: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
91e0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
91f0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
9200: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
9210: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
9220: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
9230: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
9240: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9250: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
9260: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9270: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9280: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9290: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
92a0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
92b0: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
92c0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
92d0: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
92e0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
92f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
9300: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
9310: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9320: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9330: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9340: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9350: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9360: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9370: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9380: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9390: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
93a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
93b0: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
93c0: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
93d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
93e0: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
93f0: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
9400: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
9410: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9420: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9430: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9440: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9450: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9460: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9470: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9480: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9490: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
94a0: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
94b0: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
94c0: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
94d0: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
94e0: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
94f0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
9500: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
9510: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9520: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9530: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9540: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9550: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9560: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9570: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9580: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9590: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
95a0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
95b0: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
95c0: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
95d0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
95e0: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
95f0: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
9600: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
9610: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9620: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9630: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9640: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9650: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9660: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9670: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9680: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9690: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
96a0: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
96b0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
96c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
96d0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
96e0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
96f0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9700: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
9710: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9720: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9730: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9740: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9750: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9760: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9770: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9780: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9790: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
97a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
97b0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
97c0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
97d0: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
97e0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
97f0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
9800: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
9810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9820: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9830: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9840: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9850: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9860: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
9870: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
9880: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
9890: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
98a0: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
98b0: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
98c0: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
98d0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
98e0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
98f0: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
9900: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
9910: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
9920: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9930: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
9940: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
9950: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
9960: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
9970: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
9980: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
9990: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
99a0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
99b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
99c0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
99d0: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
99e0: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
99f0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
9a00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9a10: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
9a20: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
9a30: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9a40: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9a50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9a60: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9a70: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9a80: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9a90: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  >=SHARED_LOCK ||
9aa0: 20 70 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29   p->noReadlock )
9ab0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
9ac0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
9ad0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20  RITER_LOCKED:.  
9ae0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9af0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
9b00: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
9b10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9b20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9b30: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
9b40: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
9b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
9b60: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45  rt( p->eLock>=RE
9b70: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
9b80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
9b90: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
9ba0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ize==pPager->dbO
9bb0: 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  rigSize );.     
9bc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9bd0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9be0: 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
9bf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9c00: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9c10: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize==pPager->dbH
9c20: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
9c30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9c40: 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b  >setMaster==0 );
9c50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9c60: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9c70: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20  ITER_CACHEMOD:. 
9c80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9c90: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
9ca0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9cb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9cc0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9cd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61  );.      if( !pa
9ce0: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
9cf0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9d00: 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
9d10: 68 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d  hat if journal_m
9d20: 6f 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61  ode=wal here tha
9d30: 74 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20  t neither the.  
9d40: 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
9d50: 20 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41   file nor the WA
9d60: 4c 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e  L file are open.
9d70: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75   This happens du
9d80: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ring.        ** 
9d90: 61 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73  a rollback trans
9da0: 61 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74  action that swit
9db0: 63 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ches from journa
9dc0: 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20  l_mode=off.     
9dd0: 20 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c     ** to journal
9de0: 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20  _mode=wal..     
9df0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
9e00: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9e10: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
9e20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9e30: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
9e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
9e50: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9e60: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9e70: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
9e80: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
9e90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9ea0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
9eb0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
9ec0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9ed0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9ee0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze==pPager->dbFi
9ef0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  leSize );.      
9f00: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9f10: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
9f20: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
9f30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
9f40: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
9f50: 52 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20  RITER_DBMOD:.   
9f60: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9f70: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9f80: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
9f90: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
9fa0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
9fb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9fc0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
9fd0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61  ager) );.      a
9fe0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e  ssert( p->eLock>
9ff0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a000: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a010: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a020: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a030: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a040: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a050: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a060: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a070: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a080: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a090: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a0a0: 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
a0b0: 53 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Size<=pPager->db
a0c0: 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  HintSize );.    
a0d0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a0e0: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a0f0: 46 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20  FINISHED:.      
a100: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a110: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a120: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a130: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a140: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a150: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a160: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a170: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a180: 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66  rt( isOpen(p->jf
a190: 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  d) .           |
a1a0: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  | p->journalMode
a1b0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
a1c0: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
a1d0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a1e0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a1f0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a200: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65      );.      bre
a210: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a220: 47 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  GER_ERROR:.     
a230: 20 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62   /* There must b
a240: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
a250: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
a260: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
a270: 72 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  r if.      ** in
a280: 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74   ERROR state. Ot
a290: 68 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65  herwise the page
a2a0: 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  r should have al
a2b0: 72 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20  ready dropped.  
a2c0: 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f      ** back to O
a2d0: 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20  PEN state..     
a2e0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
a2f0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a300: 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
a310: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a320: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
a330: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
a340: 63 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20  che)>0 );.      
a350: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
a360: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
a370: 20 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55   /* ifndef NDEBU
a380: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
a390: 49 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a  ITE_DEBUG ./*.**
a3a0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
a3b0: 72 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61  r to a human rea
a3c0: 64 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20  dable string in 
a3d0: 61 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a  a static buffer.
a3e0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
a3f0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  e state of the P
a400: 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
a410: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
a420: 74 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e  t. This.** is in
a430: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
a440: 64 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65  d within debugge
a450: 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  rs. For example,
a460: 20 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69   as an alternati
a470: 76 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20  ve.** to "print 
a480: 2a 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a  *pPager" in gdb:
a490: 0a 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69  .**.** (gdb) pri
a4a0: 6e 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f  ntf "%s", print_
a4b0: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
a4c0: 65 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  er).*/.static ch
a4d0: 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f  ar *print_pager_
a4e0: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
a4f0: 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
a500: 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71  Ret[1024];..  sq
a510: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
a520: 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20  024, zRet,.     
a530: 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20   "Filename:     
a540: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74   %s\n".      "St
a550: 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20  ate:         %s 
a560: 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20  errCode=%d\n".  
a570: 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20      "Lock:      
a580: 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20      %s\n".      
a590: 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20  "Locking mode:  
a5a0: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c  locking_mode=%s\
a5b0: 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61  n".      "Journa
a5c0: 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c  l mode:  journal
a5d0: 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20  _mode=%s\n".    
a5e0: 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65    "Backing store
a5f0: 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65  : tempFile=%d me
a600: 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61  mDb=%d useJourna
a610: 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a  l=%d\n".      "J
a620: 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f  ournal:       jo
a630: 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f  urnalOff=%lld jo
a640: 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22  urnalHdr=%lld\n"
a650: 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20  .      "Size:   
a660: 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64         dbsize=%d
a670: 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64   dbOrigSize=%d d
a680: 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a  bFileSize=%d\n".
a690: 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65        , p->zFile
a6a0: 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  name.      , p->
a6b0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
a6c0: 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20  EN            ? 
a6d0: 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20  "OPEN" :.       
a6e0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a6f0: 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20  R_READER        
a700: 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20    ? "READER" :. 
a710: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a720: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
a730: 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45  OCKED   ? "WRITE
a740: 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20  R_LOCKED" :.    
a750: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a760: 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
a770: 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43  EMOD ? "WRITER_C
a780: 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20  ACHEMOD" :.     
a790: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a7a0: 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
a7b0: 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42      ? "WRITER_DB
a7c0: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
a7d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a7e0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
a7f0: 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ? "WRITER_FINISH
a800: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
a810: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
a820: 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f  RROR           ?
a830: 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72   "ERROR" : "?err
a840: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e  or?".      , (in
a850: 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  t)p->errCode.   
a860: 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e     , p->eLock==N
a870: 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f  O_LOCK         ?
a880: 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20   "NO_LOCK" :.   
a890: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52       p->eLock==R
a8a0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f  ESERVED_LOCK   ?
a8b0: 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20   "RESERVED" :.  
a8c0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
a8d0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
a8e0: 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a  ? "EXCLUSIVE" :.
a8f0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
a900: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  ==SHARED_LOCK   
a910: 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20    ? "SHARED" :. 
a920: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
a930: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20  =UNKNOWN_LOCK   
a940: 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22   ? "UNKNOWN" : "
a950: 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c  ?error?".      ,
a960: 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64   p->exclusiveMod
a970: 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20  e ? "exclusive" 
a980: 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20  : "normal".     
a990: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64   , p->journalMod
a9a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a9b0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20  MODE_MEMORY   ? 
a9c0: 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20  "memory" :.     
a9d0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
a9e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a9f0: 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20  MODE_OFF      ? 
aa00: 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20  "off" :.        
aa10: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aa20: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aa30: 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65  E_DELETE   ? "de
aa40: 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  lete" :.        
aa50: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aa60: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aa70: 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65  E_PERSIST  ? "pe
aa80: 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20  rsist" :.       
aa90: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
aaa0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
aab0: 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74  DE_TRUNCATE ? "t
aac0: 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20  runcate" :.     
aad0: 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64     p->journalMod
aae0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
aaf0: 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20  MODE_WAL      ? 
ab00: 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f  "wal" : "?error?
ab10: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
ab20: 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74  ->tempFile, (int
ab30: 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29  )p->memDb, (int)
ab40: 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  p->useJournal.  
ab50: 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c      , p->journal
ab60: 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48  Off, p->journalH
ab70: 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  dr.      , (int)
ab80: 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29  p->dbSize, (int)
ab90: 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28  p->dbOrigSize, (
aba0: 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a  int)p->dbFileSiz
abb0: 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  e.  );..  return
abc0: 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a   zRet;.}.#endif.
abd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
abe0: 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65  ue if it is nece
abf0: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70  ssary to write p
ac00: 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68  age *pPg into th
ac10: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a  e sub-journal..*
ac20: 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74  * A page needs t
ac30: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
ac40: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
ac50: 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  l if there exist
ac60: 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  s one.** or more
ac70: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
ac80: 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a   for which:.**.*
ac90: 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e  *   * The page-n
aca0: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
acb0: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50  an or equal to P
acc0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f  agerSavepoint.nO
acd0: 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  rig, and.**   * 
ace0: 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  The bit correspo
acf0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  nding to the pag
ad00: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  e-number is not 
ad10: 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61  set in.**     Pa
ad20: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
ad30: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  Savepoint..*/.st
ad40: 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71  atic int subjReq
ad50: 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20  uiresPage(PgHdr 
ad60: 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67  *pPg){.  Pgno pg
ad70: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
ad80: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
ad90: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
ada0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
adb0: 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  0; i<pPager->nSa
adc0: 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  vepoint; i++){. 
add0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
ade0: 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
adf0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20  aSavepoint[i];. 
ae00: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e     if( p->nOrig>
ae10: 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69  =pgno && 0==sqli
ae20: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d  te3BitvecTest(p-
ae30: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
ae40: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  gno) ){.      re
ae50: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
ae60: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
ae70: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
ae80: 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
ae90: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
aea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
aeb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
aec0: 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72  eInJournal(PgHdr
aed0: 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
aee0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
aef0: 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  st(pPg->pPager->
af00: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
af10: 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
af20: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
af30: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
af40: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
af50: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
af60: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
af70: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
af80: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
af90: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
afa0: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
afb0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
afc0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
afd0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
afe0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
aff0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
b000: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
b010: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
b020: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b030: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b040: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
b050: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
b060: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
b070: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
b080: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
b090: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
b0a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b0b0: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
b0c0: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
b0d0: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
b0e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
b0f0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b100: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
b110: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
b120: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
b130: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
b140: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
b150: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
b160: 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a  u8*)A,B).../*.**
b170: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
b180: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
b190: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
b1a0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
b1b0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
b1c0: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
b1d0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b1e0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b1f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b200: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
b210: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
b220: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
b230: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
b240: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
b250: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
b260: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
b270: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
b280: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  t);.}../*.** Unl
b290: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
b2a0: 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65   file to level e
b2b0: 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74  Lock, which must
b2c0: 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
b2d0: 43 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f  CK.** or SHARED_
b2e0: 4c 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73  LOCK. Regardless
b2f0: 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
b300: 6f 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  ot the call to x
b310: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63  Unlock().** succ
b320: 65 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61  eeds, set the Pa
b330: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
b340: 6c 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  le to match the 
b350: 28 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20  (attempted) new 
b360: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  lock..**.** Exce
b370: 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f  pt, if Pager.eLo
b380: 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b  ck is set to UNK
b390: 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74  NOWN_LOCK when t
b3a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
b3b0: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
b3c0: 74 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65  t modify it. See
b3d0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
b3e0: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
b3f0: 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  f .** UNKNOWN_LO
b400: 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
b410: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a  ation of this..*
b420: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b430: 65 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72  erUnlockDb(Pager
b440: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c   *pPager, int eL
b450: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ock){.  int rc =
b460: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
b470: 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
b480: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
b490: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
b4a0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72  eLock );.  asser
b4b0: 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  t( eLock==NO_LOC
b4c0: 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  K || eLock==SHAR
b4d0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
b4e0: 65 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  ert( eLock!=NO_L
b4f0: 4f 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57  OCK || pagerUseW
b500: 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
b510: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
b520: 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
b530: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
b540: 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b  >eLock>=eLock );
b550: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b560: 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
b570: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
b580: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c    if( pPager->eL
b590: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
b5a0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
b5b0: 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65  r->eLock = (u8)e
b5c0: 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Lock;.    }.    
b5d0: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
b5e0: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
b5f0: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20  r, eLock)).  }. 
b600: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b610: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61  *.** Lock the da
b620: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b630: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b640: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b650: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a   SHARED_LOCK,.**
b660: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
b670: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
b680: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  . If the caller 
b690: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  is successful, s
b6a0: 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  et the.** Pager.
b6b0: 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74  eLock variable t
b6c0: 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e  o the new lockin
b6d0: 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  g state. .**.** 
b6e0: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
b6f0: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
b700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
b710: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b720: 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20   is .** called, 
b730: 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74  do not modify it
b740: 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20   unless the new 
b750: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73  locking state is
b760: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
b770: 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d   .** See the com
b780: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b790: 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57  define of UNKNOW
b7a0: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
b7b0: 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66  planation .** of
b7c0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b7d0: 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62   int pagerLockDb
b7e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b7f0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b800: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b810: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  ;..  assert( eLo
b820: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b830: 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  || eLock==RESERV
b840: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
b850: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
b860: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
b870: 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c  ->eLock<eLock ||
b880: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
b890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
b8a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b8b0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
b8c0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
b8d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b8e0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
b8f0: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
b900: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
b910: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
b920: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
b930: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
b940: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
b950: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
b960: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
b970: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
b980: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
b990: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
b9a0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
b9b0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
b9c0: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
b9d0: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
b9e0: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
b9f0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
ba00: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
ba10: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
ba20: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
ba30: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
ba40: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
ba50: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
ba60: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
ba70: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
ba80: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
ba90: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
baa0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
bab0: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
bac0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
bad0: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
bae0: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
baf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
bb00: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
bb10: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
bb20: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
bb30: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
bb40: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
bb50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
bb60: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
bb70: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
bb80: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
bb90: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
bba0: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
bbb0: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
bbc0: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
bbd0: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
bbe0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bbf0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
bc00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
bc10: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
bc20: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
bc30: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
bc40: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
bc50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
bc60: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
bc70: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
bc80: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
bc90: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
bca0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
bcb0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
bcc0: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
bcd0: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcf0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
bd00: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
bd10: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
bd40: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
bd50: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
bd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
bd70: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
bd80: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
bd90: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
bda0: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
bdb0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
bdc0: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
bdd0: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
bde0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
bdf0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
be00: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
be10: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
be20: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
be30: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
be40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
be50: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
be60: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
be70: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
be80: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
be90: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
bea0: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
beb0: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
bec0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
bed0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
bee0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bef0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
bf00: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
bf10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
bf20: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
bf30: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
bf40: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
bf50: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
bf60: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
bf70: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
bf80: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
bf90: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
bfa0: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
bfb0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
bfc0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
bfd0: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
bfe0: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
bff0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
c000: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
c010: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
c020: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
c030: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
c040: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
c050: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
c060: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c070: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
c080: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
c090: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
c0a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
c0b0: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
c0c0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
c0d0: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
c0e0: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
c0f0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
c100: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
c110: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
c120: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
c130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c140: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
c150: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
c160: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
c170: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
c180: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
c190: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
c1a0: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
c1b0: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
c1c0: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
c1d0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
c1e0: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
c1f0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
c200: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
c210: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
c220: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
c230: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
c240: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
c250: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
c260: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
c270: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
c280: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
c290: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
c2a0: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
c2b0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
c2c0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
c2d0: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
c2e0: 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
c2f0: 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
c300: 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d  .  assert( (pPg-
c310: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
c320: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
c330: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
c340: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
c350: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
c360: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
c370: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
c380: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
c390: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c3a0: 73 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a  set_pagehash(X).
c3b0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c3c0: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
c3d0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
c3e0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
c3f0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
c400: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
c410: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
c420: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
c430: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
c440: 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
c450: 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ead a master jou
c460: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66  rnal file name f
c470: 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20  rom the .** end 
c480: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c  of the file and,
c490: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
c4a0: 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d  copies it into m
c4b0: 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a  emory supplied .
c4c0: 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ** by the caller
c4d0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
c4e0: 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72  bove writeMaster
c4f0: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68  Journal() for th
c500: 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64  e format.** used
c510: 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74   to store a mast
c520: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
c530: 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20  name at the end 
c540: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  of a journal fil
c550: 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72  e..**.** zMaster
c560: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
c570: 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65   buffer of at le
c580: 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65  ast nMaster byte
c590: 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
c5a0: 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  * the caller. Th
c5b0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c  is should be sql
c5c0: 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
c5d0: 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65  ame+1 (to ensure
c5e0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f   there is.** eno
c5f0: 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69  ugh space to wri
c600: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c610: 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20  urnal name). If 
c620: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c630: 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68  al.** name in th
c640: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e  e journal is lon
c650: 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72  ger than nMaster
c660: 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e   bytes (includin
c670: 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  g a.** nul-termi
c680: 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69  nator), then thi
c690: 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20  s is handled as 
c6a0: 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  if no master jou
c6b0: 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72  rnal name.** wer
c6c0: 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  e present in the
c6d0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c6e0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
c6f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c700: 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20   present at the 
c710: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
c720: 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  al.** file, then
c730: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e   it is copied in
c740: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
c750: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
c760: 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65  ter. A.** nul-te
c770: 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
c780: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
c790: 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e   buffer followin
c7a0: 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  g the master.** 
c7b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c7c0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  e..**.** If it i
c7d0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  s determined tha
c7e0: 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  t no master jour
c7f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c800: 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61   present .** zMa
c810: 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74  ster[0] is set t
c820: 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
c830: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
c840: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
c850: 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69  curs while readi
c860: 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ng from the jour
c870: 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c  nal file, an SQL
c880: 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  ite.** error cod
c890: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
c8a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
c8b0: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73  dMasterJournal(s
c8c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72  qlite3_file *pJr
c8d0: 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nl, char *zMaste
c8e0: 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b  r, u32 nMaster){
c8f0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c910: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
c920: 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20    u32 len;      
c930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c940: 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20  Length in bytes 
c950: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
c960: 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20  l name */.  i64 
c970: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
c980: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
c990: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
c9a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a   journal file pJ
c9b0: 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  rnl */.  u32 cks
c9c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
c9d0: 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73      /* MJ checks
c9e0: 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  um value read fr
c9f0: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  om journal */.  
ca00: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
ca10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
ca20: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
ca30: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
ca40: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
ca50: 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20  ;   /* A buffer 
ca60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
ca70: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d  c header */.  zM
ca80: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
ca90: 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
caa0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cab0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
cac0: 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73  , &szJ)).   || s
cad0: 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49  zJ<16.   || SQLI
cae0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
caf0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
cb00: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20  zJ-16, &len)).  
cb10: 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72   || len>=nMaster
cb20: 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f   .   || SQLITE_O
cb30: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
cb40: 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  its(pJrnl, szJ-1
cb50: 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c  2, &cksum)).   |
cb60: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
cb70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
cb80: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
cb90: 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c  8, szJ-8)).   ||
cba0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
cbb0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
cbc0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
cbd0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
cbe0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
cbf0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
cc00: 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20  16-len)).  ){.  
cc10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
cc20: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
cc30: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
cc40: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
cc50: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
cc60: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
cc70: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
cc80: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
cc90: 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29   }.  if( cksum )
cca0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
ccb0: 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74  checksum doesn't
ccc0: 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e   add up, then on
ccd0: 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65  e or more of the
cce0: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20   disk sectors.  
ccf0: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20    ** containing 
cd00: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cd10: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63  al filename is c
cd20: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d  orrupted. This m
cd30: 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  eans.    ** defi
cd40: 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b  nitely roll back
cd50: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
cd60: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72   SQLITE_OK and r
cd70: 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20  eport a (nul).  
cd80: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
cd90: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20  nal filename..  
cda0: 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30    */.    len = 0
cdb0: 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b  ;.  }.  zMaster[
cdc0: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
cdd0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
cde0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
cdf0: 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20  turn the offset 
ce00: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f  of the sector bo
ce10: 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d  undary at or imm
ce20: 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c  ediately .** fol
ce30: 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65  lowing the value
ce40: 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   in pPager->jour
ce50: 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67  nalOff, assuming
ce60: 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69   a sector .** si
ce70: 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65  ze of pPager->se
ce80: 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a  ctorSize bytes..
ce90: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
cea0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
ceb0: 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65  12:.**.**   Page
cec0: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20  r.journalOff    
ced0: 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c        Return val
cee0: 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ue.**   --------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cf10: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
cf30: 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20  .**   512       
cf40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf50: 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20  512.**   100    
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30     512.**   2000
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
cfa0: 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75  /.static i64 jou
cfb0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61  rnalHdrOffset(Pa
cfc0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
cfd0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
cfe0: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
cff0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
d000: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
d010: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
d020: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d030: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
d040: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
d050: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
d060: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
d070: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
d080: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
d090: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
d0a0: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
d0b0: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
d0c0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
d0d0: 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  urn offset;.}../
d0e0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
d0f0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
d100: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
d110: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d120: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d130: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
d140: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
d150: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
d160: 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77   written to.** w
d170: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
d180: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  t transaction (i
d190: 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75  .e. if Pager.jou
d1a0: 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a  rnalOff==0)..**.
d1b0: 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65  ** If doTruncate
d1c0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20   is non-zero or 
d1d0: 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  the Pager.journa
d1e0: 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61  lSizeLimit varia
d1f0: 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ble is.** set to
d200: 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74   0, then truncat
d210: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
d220: 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  le to zero bytes
d230: 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77   in size. Otherw
d240: 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65  ise,.** zero the
d250: 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20   28-byte header 
d260: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d280: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
d290: 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  , .** if the pag
d2a0: 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d  er is not in no-
d2b0: 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20  sync mode, sync 
d2c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d2d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d2e0: 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f   after writing o
d2f0: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e  r truncating it.
d300: 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e  .**.** If Pager.
d310: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d320: 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73   is set to a pos
d330: 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20  itive, non-zero 
d340: 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f  value, and.** fo
d350: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e  llowing the trun
d360: 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e  cation or zeroin
d370: 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  g described abov
d380: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
d390: 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  e .** journal fi
d3a0: 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c  le in bytes is l
d3b0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
d3c0: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e  value, then trun
d3d0: 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cate the.** jour
d3e0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65  nal file to Page
d3f0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d400: 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f  it bytes. The jo
d410: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a  urnal file does.
d420: 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  ** not need to b
d430: 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69  e synced followi
d440: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d450: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  n..**.** If an I
d460: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
d470: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d480: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d490: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e  e IO error code.
d4a0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
d4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
d4c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a  .*/.static int z
d4d0: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eroJournalHdr(Pa
d4e0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
d4f0: 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20   doTruncate){.  
d500: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
d510: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d530: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
d540: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
d550: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
d560: 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
d570: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
d580: 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69  .    const i64 i
d590: 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  Limit = pPager->
d5a0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d5b0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
d5c0: 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20  che of jsl */.. 
d5d0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
d5e0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
d5f0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
d600: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
d610: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
d620: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
d630: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
d640: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
d650: 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  {.      static c
d660: 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64  onst char zeroHd
d670: 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20  r[28] = {0};.   
d680: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d690: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
d6a0: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
d6b0: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
d6c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d6d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d6e0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
d6f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
d700: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
d710: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
d720: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
d730: 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
d740: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d750: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d760: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
d770: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
d780: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
d790: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
d7a0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
d7b0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
d7c0: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
d7d0: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
d7e0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
d7f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
d800: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
d810: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
d820: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
d830: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
d840: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
d850: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
d860: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
d870: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
d880: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
d890: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
d8a0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
d8b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d8c0: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
d8d0: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
d8e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d8f0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
d900: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
d910: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d920: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
d930: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
d940: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
d950: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
d960: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
d970: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
d980: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d990: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
d9a0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
d9b0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
d9c0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
d9d0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
d9e0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
d9f0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
da00: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
da10: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
da20: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
da30: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
da40: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
da50: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
da60: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
da70: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
da80: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
da90: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
daa0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
dab0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
dac0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
dad0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
dae0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
daf0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
db00: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
db10: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
db20: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
db30: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
db40: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
db50: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
db60: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
db70: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
db80: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
db90: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
dba0: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
dbb0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
dbc0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
dbd0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
dbe0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
dbf0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
dc00: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
dc10: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
dc20: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
dc30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
dc40: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  urn code */.  ch
dc50: 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50  ar *zHeader = pP
dc60: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
dc70: 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
dc80: 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69  pace used to bui
dc90: 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  ld header */.  u
dca0: 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33  32 nHeader = (u3
dcb0: 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  2)pPager->pageSi
dcc0: 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75  ze;/* Size of bu
dcd0: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
dce0: 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20  by zHeader */.  
dcf0: 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20  u32 nWrite;     
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd10: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
dd20: 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72  header sector wr
dd30: 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  itten */.  int i
dd40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dd60: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
dd70: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
dd80: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
dd90: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
dda0: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
ddb0: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28   open. */..  if(
ddc0: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
ddd0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
dde0: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
ddf0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
de00: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
de10: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
de20: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
de30: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
de40: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a  m were created .
de50: 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d    ** since the m
de60: 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e  ost recent journ
de70: 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72  al header was wr
de80: 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68  itten, update th
de90: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  e .  ** PagerSav
dea0: 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
deb0: 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20  t fields now..  
dec0: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
ded0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
dee0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
def0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61   if( pPager->aSa
df00: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
df10: 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20  Offset==0 ){.   
df20: 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
df30: 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66  point[ii].iHdrOf
df40: 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
df50: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d  ournalOff;.    }
df60: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
df70: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
df80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
df90: 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
dfa0: 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  et(pPager);..  /
dfb0: 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68  * .  ** Write th
dfc0: 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74  e nRec Field - t
dfd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
dfe0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
dff0: 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20  ollow this.  ** 
e000: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
e010: 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69  Normally, zero i
e020: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
e030: 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20  s value at this 
e040: 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72  time..  ** After
e050: 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65   the records are
e060: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f   added to the jo
e070: 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a  urnal (and the j
e080: 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a  ournal synced, .
e090: 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d    ** if in full-
e0a0: 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20  sync mode), the 
e0b0: 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74  zero is overwrit
e0c0: 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75  ten with the tru
e0d0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66  e number.  ** of
e0e0: 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79   records (see sy
e0f0: 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20  ncJournal())..  
e100: 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72  **.  ** A faster
e110: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20   alternative is 
e120: 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46  to write 0xFFFFF
e130: 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20  FFF to the nRec 
e140: 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a  field. When.  **
e150: 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75   reading the jou
e160: 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20  rnal this value 
e170: 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20  tells SQLite to 
e180: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a  assume that the.
e190: 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65    ** rest of the
e1a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
e1b0: 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67  ntains valid pag
e1c0: 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20  e records. This 
e1d0: 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20  assumption.  ** 
e1e0: 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73  is dangerous, as
e1f0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e200: 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72  curred whilst wr
e210: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
e220: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
e230: 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f  t may contain so
e240: 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e  me garbage data.
e250: 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73   There are two s
e260: 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68  cenarios.  ** wh
e270: 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61  ere this risk ca
e280: 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20  n be ignored:.  
e290: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
e2a0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
e2b0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43   no-sync mode. C
e2c0: 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f  orruption can fo
e2d0: 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20  llow a.  **     
e2e0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e  power failure in
e2f0: 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61   this case anywa
e300: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  y..  **.  **   *
e310: 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45   When the SQLITE
e320: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
e330: 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20  ND flag is set. 
e340: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a  This guarantees.
e350: 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61    **     that ga
e360: 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65  rbage data is ne
e370: 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ver appended to 
e380: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e390: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
e3a0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
e3b0: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
e3c0: 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70  oSync );.  if( p
e3d0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
e3e0: 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
e3f0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
e400: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29  RNALMODE_MEMORY)
e410: 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
e420: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
e430: 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
e440: 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
e450: 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20  SAFE_APPEND) .  
e460: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48  ){.    memcpy(zH
e470: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
e480: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
e490: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
e4a0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e4b0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e4c0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
e4d0: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
e4e0: 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48  e{.    memset(zH
e4f0: 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  eader, 0, sizeof
e500: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
e510: 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  4);.  }..  /* Th
e520: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
e530: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
e540: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61  */ .  sqlite3_ra
e550: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
e560: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e570: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
e580: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
e590: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
e5a0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e5b0: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
e5c0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
e5d0: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
e5e0: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
e5f0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e600: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e610: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
e620: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29  ger->dbOrigSize)
e630: 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d  ;.  /* The assum
e640: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
e650: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
e660: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
e670: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
e680: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32  JournalMagic)+12
e690: 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ], pPager->secto
e6a0: 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  rSize);..  /* Th
e6b0: 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  e page size */. 
e6c0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e6d0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e6e0: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
e6f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
e700: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
e710: 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66  zing the tail of
e720: 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e   the buffer is n
e730: 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45  ot necessary.  E
e740: 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77  verything.  ** w
e750: 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65  orks find if the
e760: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65   following memse
e770: 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20  t() is omitted. 
e780: 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   But initializin
e790: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72  g.  ** the memor
e7a0: 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72  y prevents valgr
e7b0: 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69  ind from complai
e7c0: 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20  ning, so we are 
e7d0: 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20  willing to.  ** 
e7e0: 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d  take the perform
e7f0: 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20  ance hit..  */. 
e800: 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72   memset(&zHeader
e810: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e820: 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20  Magic)+20], 0,. 
e830: 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d          nHeader-
e840: 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  (sizeof(aJournal
e850: 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20  Magic)+20));..  
e860: 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74  /* In theory, it
e870: 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61   is only necessa
e880: 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
e890: 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68  28 bytes that th
e8a0: 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  e .  ** journal 
e8b0: 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20  header consumes 
e8c0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
e8d0: 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69  ile here. Then i
e8e0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ncrement the .  
e8f0: 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ** Pager.journal
e900: 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20  Off variable by 
e910: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73  JOURNAL_HDR_SZ s
e920: 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  o that the next 
e930: 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20  .  ** record is 
e940: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
e950: 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20  ollowing sector 
e960: 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69  (leaving a gap i
e970: 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  n the file.  ** 
e980: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70  that will be imp
e990: 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69  licitly filled i
e9a0: 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20  n by the OS)..  
e9b0: 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20  **.  ** However 
e9c0: 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63  it has been disc
e9d0: 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73  overed that on s
e9e0: 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73  ome systems this
e9f0: 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20   pattern can .  
ea00: 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e  ** be significan
ea10: 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20  tly slower than 
ea20: 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69  contiguously wri
ea30: 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65  ting data to the
ea40: 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e   file,.  ** even
ea50: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65   if that means e
ea60: 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e  xplicitly writin
ea70: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c  g data to the bl
ea80: 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f  ock of .  ** (JO
ea90: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
eaa0: 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69  8) bytes that wi
eab0: 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20  ll not be used. 
eac0: 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a  So that is what.
ead0: 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20    ** is done. . 
eae0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f   **.  ** The loo
eaf0: 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65  p is required he
eb00: 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73  re in case the s
eb10: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
eb20: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
eb30: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67   ** database pag
eb40: 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68  e size. Since th
eb50: 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72  e zHeader buffer
eb60: 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70   is only Pager.p
eb70: 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74  ageSize.  ** byt
eb80: 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65  es in size, more
eb90: 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74   than one call t
eba0: 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  o sqlite3OsWrite
ebb0: 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72  () may be requir
ebc0: 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c  ed.  ** to popul
ebd0: 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  ate the entire j
ebe0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
ebf0: 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  ctor..  */ .  fo
ec00: 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d  r(nWrite=0; rc==
ec10: 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74  SQLITE_OK&&nWrit
ec20: 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e<JOURNAL_HDR_SZ
ec30: 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65  (pPager); nWrite
ec40: 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20  +=nHeader){.    
ec50: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
ec60: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
ec70: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
ec80: 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65  urnalHdr, nHeade
ec90: 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r)).    rc = sql
eca0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ecb0: 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
ecc0: 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65  , nHeader, pPage
ecd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
ece0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ecf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c  er->journalHdr <
ed00: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
ed10: 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67  lOff );.    pPag
ed20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
ed30: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
ed40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ed50: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
ed60: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
ed70: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
ed80: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
ed90: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
eda0: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
edb0: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
edc0: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
edd0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
ede0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
edf0: 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c  e. The current l
ee00: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
ee10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67  ournal file is g
ee20: 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65  iven by.** pPage
ee30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53  r->journalOff. S
ee40: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
ee50: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
ee60: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
ee70: 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f  .** a descriptio
ee80: 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n of the journal
ee90: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
eea0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
eeb0: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
eec0: 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63  essfully, *pNRec
eed0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
eee0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
eef0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
ef00: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
ef10: 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73  nd *pDbSize is s
ef20: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
ef30: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
ef40: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
ef50: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
ef60: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
ef70: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ef80: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
ef90: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
efa0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
efb0: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
efc0: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
efd0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
efe0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
eff0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
f000: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
f010: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
f020: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
f030: 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e  ed and *pNRec an
f040: 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75  d *PDbSize are u
f050: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
f060: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
f070: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
f080: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f090: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
f0a0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f0b0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f0c0: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
f0d0: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
f0e0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
f0f0: 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
f100: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f  ct */.  int isHo
f110: 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  t,.  i64 journal
f120: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
f130: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f140: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
f150: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
f160: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20   u32 *pNRec,    
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f180: 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64   OUT: Value read
f190: 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66   from the nRec f
f1a0: 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ield */.  u32 *p
f1b0: 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  DbSize          
f1c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
f1d0: 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c  alue of original
f1e0: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
f1f0: 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ield */.){.  int
f200: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f220: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  urn code */.  un
f230: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
f240: 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20  ic[8];     /* A 
f250: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
f260: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
f270: 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
f280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f290: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a    /* Offset of j
f2a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65  ournal header be
f2b0: 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61  ing read */..  a
f2c0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f2d0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
f2e0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
f2f0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
f300: 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63   */..  /* Advanc
f310: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  e Pager.journalO
f320: 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ff to the start 
f330: 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  of the next sect
f340: 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  or. If the.  ** 
f350: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f360: 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68  too small for th
f370: 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64  ere to be a head
f380: 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69  er stored at thi
f390: 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65  s.  ** point, re
f3a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f3b0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
f3c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
f3d0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
f3e0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
f3f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f400: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
f410: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
f420: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
f430: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
f440: 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d  .  }.  iHdrOff =
f450: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f460: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  Off;..  /* Read 
f470: 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62  in the first 8 b
f480: 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
f490: 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74  nal header. If t
f4a0: 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
f4b0: 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63  .  ** the  magic
f4c0: 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74   string found at
f4d0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
f4e0: 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ch journal heade
f4f0: 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  r, return.  ** S
f500: 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61  QLITE_DONE. If a
f510: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f520: 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  s, return an err
f530: 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69  or code. Otherwi
f540: 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64  se,.  ** proceed
f550: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48  ..  */.  if( isH
f560: 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70  ot || iHdrOff!=p
f570: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f580: 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  r ){.    rc = sq
f590: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
f5a0: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
f5b0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
f5c0: 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69   iHdrOff);.    i
f5d0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
f5e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f5f0: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61      if( memcmp(a
f600: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
f610: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
f620: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
f630: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f640: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
f650: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
f660: 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69  irst three 32-bi
f670: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
f680: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20  journal header: 
f690: 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69  The nRec.  ** fi
f6a0: 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75  eld, the checksu
f6b0: 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e  m-initializer an
f6c0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
f6d0: 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ize at the start
f6e0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61  .  ** of the tra
f6f0: 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e  nsaction. Return
f700: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f710: 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
f720: 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  wrong..  */.  if
f730: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
f740: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
f750: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
f760: 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20  ff+8, pNRec)).  
f770: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f780: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f790: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f7a0: 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72  rOff+12, &pPager
f7b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20  ->cksumInit)).  
f7c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
f7d0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
f7e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
f7f0: 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65  rOff+16, pDbSize
f800: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
f810: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
f820: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f830: 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75  lOff==0 ){.    u
f840: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20  32 iPageSize;   
f850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
f860: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  age-size field o
f870: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
f880: 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63   */.    u32 iSec
f890: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
f8a0: 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73       /* Sector-s
f8b0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75  ize field of jou
f8c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a  rnal header */..
f8d0: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
f8e0: 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
f8f0: 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61  ctor-size journa
f900: 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e  l header fields.
f910: 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49   */.    if( SQLI
f920: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
f930: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
f940: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c  jfd, iHdrOff+20,
f950: 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a   &iSectorSize)).
f960: 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
f970: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
f980: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
f990: 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50   iHdrOff+24, &iP
f9a0: 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b  ageSize)).    ){
f9b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f9c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f9d0: 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  Versions of SQLi
f9e0: 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e  te prior to 3.5.
f9f0: 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73  8 set the page-s
fa00: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
fa10: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
fa20: 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20  header to zero. 
fa30: 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73  In this case, as
fa40: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61  sume that the Pa
fa50: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20  ger.pageSize.   
fa60: 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
fa70: 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74  already set to t
fa80: 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20  he correct page 
fa90: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
faa0: 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d   if( iPageSize==
fab0: 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65  0 ){.      iPage
fac0: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
fad0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  ageSize;.    }..
fae0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
faf0: 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61  t the values rea
fb00: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d  d from the page-
fb10: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
fb20: 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20  size fields.    
fb30: 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ** are within ra
fb40: 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72  nge. To be 'in r
fb50: 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75  ange', both valu
fb60: 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20  es need to be a 
fb70: 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  power.    ** of 
fb80: 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e  two greater than
fb90: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32   or equal to 512
fba0: 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20   or 32, and not 
fbb0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
fbc0: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
fbd0: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
fbe0: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
fbf0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
fc00: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
fc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc20: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
fc30: 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  32.     || iPage
fc40: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
fc50: 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65  PAGE_SIZE || iSe
fc60: 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43  ctorSize>MAX_SEC
fc70: 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c  TOR_SIZE.     ||
fc80: 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26   ((iPageSize-1)&
fc90: 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20  iPageSize)!=0   
fca0: 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65  || ((iSectorSize
fcb0: 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29  -1)&iSectorSize)
fcc0: 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0 .    ){.    
fcd0: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68    /* If the eith
fce0: 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  er the page-size
fcf0: 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20   or sector-size 
fd00: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68  in the journal-h
fd10: 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20  eader is .      
fd20: 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e  ** invalid, then
fd30: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
fd40: 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72  t wrote the jour
fd50: 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20  nal-header must 
fd60: 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63  have .      ** c
fd70: 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68  rashed before th
fd80: 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e  e header was syn
fd90: 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
fda0: 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a  e stop reading .
fdb0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
fdc0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a  rnal file here..
fdd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
fde0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
fdf0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
fe00: 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65   Update the page
fe10: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
fe20: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
fe30: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  om the journal. 
fe40: 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65  .    ** Use a te
fe50: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74  stcase() macro t
fe60: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
fe70: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
fe80: 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50  within .    ** P
fe90: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
fea0: 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20  ) is tested..   
feb0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
fec0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
fed0: 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50  size(pPager, &iP
fee0: 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
fef0: 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
ff00: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
ff10: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
ff20: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
ff30: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
ff40: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
ff50: 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65      ** the proce
ff60: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
ff70: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
ff80: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
ff90: 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  s.    ** created
ffa0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
ffb0: 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
ffc0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
ffd0: 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62  tine.    ** is b
ffe0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
fff0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
10000 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
10010 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  cal value.    **
10020 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
10030 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
10040 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
10050 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20  hat routine..   
10060 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
10070 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65  sectorSize = iSe
10080 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ctorSize;.  }.. 
10090 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
100a0 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
100b0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
100c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
100d0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
100e0 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
100f0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
10100 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
10110 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
10120 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
10130 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
10140 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
10150 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
10160 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
10170 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
10180 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
10190 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
101a0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
101b0 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
101c0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
101d0 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
101e0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
101f0 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
10200 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
10210 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
10220 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34   is:.**.**   + 4
10230 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
10240 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20  _PGNO..**   + N 
10250 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10260 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
10270 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20  n utf-8..**   + 
10280 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67  4 bytes: N (leng
10290 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
102a0 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74  rnal name in byt
102b0 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69  es, no nul-termi
102c0 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34  nator)..**   + 4
102d0 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
102e0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
102f0 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62  ksum..**   + 8 b
10300 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
10310 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
10320 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10330 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
10340 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10350 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
10360 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
10370 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20  ame, where each 
10380 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
10390 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20  ted as a signed 
103a0 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a  8-bit integer..*
103b0 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
103c0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
103d0 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
103e0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
103f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
10400 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
10410 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
10420 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
10430 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
10440 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10450 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10460 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10490 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
104a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
104b0 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
104c0 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
104d0 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
104e0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
104f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10500 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a  t of header in j
10510 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
10520 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20   i64 jrnlSize;  
10530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10540 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
10550 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  rnal file on dis
10560 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  k */.  u32 cksum
10570 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10580 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
10590 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  sum of string zM
105a0 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  aster */..  asse
105b0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  rt( pPager->setM
105c0 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73  aster==0 );.  as
105d0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
105e0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
105f0 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20   if( !zMaster . 
10600 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
10610 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
10620 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
10630 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  RY .   || pPager
10640 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
10650 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
10660 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72  _OFF .  ){.    r
10670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10680 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
10690 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20  etMaster = 1;.  
106a0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
106b0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
106c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
106d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
106e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
106f0 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10700 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10710 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10720 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10730 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10740 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10750 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10760 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10770 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10780 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10790 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
107a0 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
107b0 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
107c0 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
107d0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
107e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
107f0 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10800 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10810 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10820 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10830 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10840 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10850 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10860 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10880 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10890 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
108a0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
108b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
108c0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
108d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
108e0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
108f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10900 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
10910 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10920 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
10930 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10940 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10950 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10960 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10970 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10980 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10990 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
109a0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
109b0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
109c0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
109d0 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
109e0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
109f0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
10a00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
10a10 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
10a20 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
10a30 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10a40 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10a50 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
10a60 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
10a70 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10a80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10a90 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
10aa0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
10ab0 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  8, iHdrOff+4+nMa
10ac0 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20  ster+8))).  ){. 
10ad0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10ae0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
10af0 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74  nalOff += (nMast
10b00 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66  er+20);..  /* If
10b10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10b20 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e   peristent-journ
10b30 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  al mode, then th
10b40 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a  e physical .  **
10b50 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61   journal-file ma
10b60 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68  y extend past th
10b70 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73  e end of the mas
10b80 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
10b90 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65  .  ** and 8 byte
10ba0 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20  s of magic data 
10bb0 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20  just written to 
10bc0 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69  the file. This i
10bd0 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75  s .  ** dangerou
10be0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  s because the co
10bf0 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61  de to rollback a
10c00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
10c10 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
10c20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20  be able to find 
10c30 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10c40 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  al name to deter
10c50 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68  mine .  ** wheth
10c60 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
10c70 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20  urnal is hot. . 
10c80 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74   **.  ** Easiest
10c90 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20   thing to do in 
10ca0 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73  this scenario is
10cb0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
10cc0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
10cd0 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69  ile to the requi
10ce0 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a  red size..  */ .
10cf0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
10d00 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
10d10 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10d20 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29  >jfd, &jrnlSize)
10d30 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  ).   && jrnlSize
10d40 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  >pPager->journal
10d50 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  Off.  ){.    rc 
10d60 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
10d70 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
10d80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10d90 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Off);.  }.  retu
10da0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10db0 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
10dc0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
10dd0 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
10de0 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  ber. Return.** a
10df0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
10e00 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
10e10 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
10e20 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c  ge is not .** al
10e30 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e  ready in memory.
10e40 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
10e50 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
10e60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
10e70 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
10e80 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ea0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
10eb0 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74  ..  /* It is not
10ec0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
10ed0 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65  call to PcacheFe
10ee0 74 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74  tch() with creat
10ef0 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a  eFlag==0 to.  **
10f00 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20   fail, since no 
10f10 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
10f20 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  ate dynamic memo
10f30 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e  ry will be made.
10f40 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
10f50 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
10f60 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
10f70 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a  , pgno, 0, &p);.
10f80 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
10f90 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
10fa0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
10fb0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
10fc0 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
10fd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
10fe0 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
10ff0 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
11000 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
11010 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
11020 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
11030 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
11040 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
11050 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
11060 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
11070 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
11080 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
11090 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
110a0 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
110b0 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
110c0 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
110d0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
110e0 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
110f0 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
11100 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
11110 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
11120 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
11130 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70  epoints(Pager *p
11140 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
11150 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11160 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
11170 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
11180 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11190 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
111a0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
111b0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
111c0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
111d0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
111e0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
111f0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
11200 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
11210 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
11220 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75   sqlite3IsMemJou
11230 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66  rnal(pPager->sjf
11240 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
11250 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
11260 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >sjfd);.  }.  sq
11270 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
11280 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a  r->aSavepoint);.
11290 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
112a0 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
112b0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
112c0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
112d0 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ubRec = 0;.}../*
112e0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
112f0 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
11300 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
11310 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a  t.pInSavepoint .
11320 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c  ** bitvecs of al
11330 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
11340 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  s. Return SQLITE
11350 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
11360 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e  l.** or SQLITE_N
11370 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63  OMEM if a malloc
11380 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
11390 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
113a0 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
113b0 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
113c0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
113d0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
113e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
113f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
11400 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11410 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  _OK;       /* Re
11420 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  sult code */..  
11430 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
11440 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
11450 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65   ii++){.    Page
11460 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
11470 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
11480 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28  int[ii];.    if(
11490 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20   pgno<=p->nOrig 
114a0 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73  ){.      rc |= s
114b0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
114c0 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
114d0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65   pgno);.      te
114e0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
114f0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
11500 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
11510 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53  LITE_OK || rc==S
11520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11530 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
11540 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
11550 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11560 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
11570 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11580 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f  sive mode and no
11590 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f  t.** in the ERRO
115a0 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
115b0 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20  se, it switches 
115c0 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47  the pager to PAG
115d0 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65  ER_OPEN.** state
115e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
115f0 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
11600 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
11610 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61  mode, the databa
11620 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f  se file is.** co
11630 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65  mpletely unlocke
11640 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  d. If the file i
11650 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74  s unlocked and t
11660 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  he file-system d
11670 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62  oes.** not exhib
11680 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42  it the UNDELETAB
11690 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f  LE_WHEN_OPEN pro
116a0 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e  perty, the journ
116b0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c  al file is.** cl
116c0 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f  osed (if it is o
116d0 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pen)..**.** If t
116e0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45  he pager is in E
116f0 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
11700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
11710 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a   called, the .**
11720 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11730 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65   pager cache are
11740 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72   discarded befor
11750 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b  e switching back
11760 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e   to .** the OPEN
11770 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65   state. Regardle
11780 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
11790 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
117a0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20  clusive-mode.** 
117b0 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72  or not, any jour
117c0 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e  nal file left in
117d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
117e0 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
117f0 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  .** as a hot-jou
11800 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
11810 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69  back the next ti
11820 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  me a read-transa
11830 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e  ction.** is open
11840 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62  ed (by this or b
11850 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e  y any other conn
11860 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74  ection)..*/.stat
11870 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
11880 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
11890 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  er){..  assert( 
118a0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
118b0 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
118c0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
118d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
118e0 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  EN .       || pP
118f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
11900 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a  GER_ERROR .  );.
11910 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
11920 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11930 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
11940 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
11950 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65  l = 0;.  release
11960 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
11970 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61  ager);..  if( pa
11980 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
11990 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
119a0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
119b0 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c  >jfd) );.    sql
119c0 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
119d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
119e0 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61  ->pWal);.    pPa
119f0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
11a00 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GER_OPEN;.  }els
11a10 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
11a20 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
11a30 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20      int rc;     
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
11a60 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65  returned by page
11a70 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20  rUnlockDb() */. 
11a80 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f     int iDc = isO
11a90 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f  pen(pPager->fd)?
11aa0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11ab0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
11ac0 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20  Pager->fd):0;.. 
11ad0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65     /* If the ope
11ae0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75  rating system su
11af0 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f  pport deletion o
11b00 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68  f open files, th
11b10 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20  en.    ** close 
11b20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11b30 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
11b40 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
11b50 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  .  Otherwise.   
11b60 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e   ** another conn
11b70 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72  ection with jour
11b80 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20  nal_mode=delete 
11b90 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65  might delete the
11ba0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74   file.    ** out
11bb0 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a   from under us..
11bc0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
11bd0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11be0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26  LMODE_MEMORY   &
11bf0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11c00 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11c10 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20  RNALMODE_OFF    
11c20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11c30 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11c40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
11c50 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
11c60 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11c70 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
11c80 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20  ELETE   & 5)!=1 
11c90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11ca0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11cb0 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d  E_TRUNCATE & 5)=
11cc0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
11cd0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11ce0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20  MODE_PERSIST  & 
11cf0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  5)==1 );.    if(
11d00 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54   0==(iDc & SQLIT
11d10 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
11d20 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20  BLE_WHEN_OPEN). 
11d30 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65      || 1!=(pPage
11d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26  r->journalMode &
11d50 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   5).    ){.     
11d60 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11d70 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
11d80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
11d90 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
11da0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61  he ERROR state a
11db0 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  nd the call to u
11dc0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
11dd0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66  se.    ** file f
11de0 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75  ails, set the cu
11df0 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e  rrent lock to UN
11e00 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
11e10 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20  the comment.    
11e20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  ** above the #de
11e30 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e  fine for UNKNOWN
11e40 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
11e50 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20  lanation of why 
11e60 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e  this.    ** is n
11e70 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
11e80 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
11e90 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
11ea0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  NO_LOCK);.    if
11eb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11ec0 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
11ed0 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e==PAGER_ERROR )
11ee0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
11ef0 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f  eLock = UNKNOWN_
11f00 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  LOCK;.    }..   
11f10 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74   /* The pager st
11f20 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67  ate may be chang
11f30 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52  ed from PAGER_ER
11f40 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45  ROR to PAGER_OPE
11f50 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69  N here.    ** wi
11f60 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74  thout clearing t
11f70 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  he error code. T
11f80 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e  his is intention
11f90 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20  al - the error. 
11fa0 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c     ** code is cl
11fb0 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61  eared and the ca
11fc0 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65  che reset in the
11fd0 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20   block below..  
11fe0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
11ff0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12000 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
12010 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
12020 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
12030 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
12040 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
12050 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
12060 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  PEN;.  }..  /* I
12070 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
12080 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
12090 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
120a0 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
120b0 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20  e.  ** trusted. 
120c0 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61  Now that there a
120d0 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  re no outstandin
120e0 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
120f0 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20  the pager,.  ** 
12100 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f  it can safely mo
12110 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ve back to PAGER
12120 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69  _OPEN state. Thi
12130 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74  s happens in bot
12140 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e  h.  ** normal an
12150 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b  d exclusive-lock
12160 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing mode..  */. 
12170 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
12180 43 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Code ){.    asse
12190 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
121a0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
121b0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
121c0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
121d0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
121e0 70 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65  pFile;.    pPage
121f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12200 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67  R_OPEN;.    pPag
12210 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
12220 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
12230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12240 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
12250 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
12260 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
12270 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  aster = 0;.}../*
12280 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12290 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
122a0 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72  ever an IOERR or
122b0 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74   FULL error that
122c0 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65   requires.** the
122d0 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69   pager to transi
122e0 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52  tion into the ER
122f0 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68  ROR state may ah
12300 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20  ve occurred..** 
12310 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
12320 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
12330 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
12340 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f  ucture, the seco
12350 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  nd .** the error
12360 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
12370 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
12380 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
12390 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75  on. The .** valu
123a0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
123b0 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
123c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
123d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
123e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
123f0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
12400 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
12410 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
12420 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20  of the.** IOERR 
12430 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70  sub-codes, the p
12440 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20  ager enters the 
12450 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
12460 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a  the error code.*
12470 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50  * is stored in P
12480 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68  ager.errCode. Wh
12490 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65  ile the pager re
124a0 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52  mains in the ERR
124b0 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c  OR state,.** all
124c0 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73   major API calls
124d0 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69   on the Pager wi
124e0 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  ll immediately r
124f0 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43  eturn Pager.errC
12500 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ode..**.** The E
12510 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63  RROR state indic
12520 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
12530 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12540 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61  ger-cache .** ca
12550 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e  nnot be trusted.
12560 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20   This state can 
12570 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f  be cleared by co
12580 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64  mpletely discard
12590 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ing .** the cont
125a0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
125b0 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72  r-cache. If a tr
125c0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63  ansaction was ac
125d0 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tive when.** the
125e0 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f   persistent erro
125f0 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e  r occurred, then
12600 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
12610 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
12620 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
12630 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
12640 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
12650 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
12660 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20  s if.** it were 
12670 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a  a hot-journal)..
12680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
12690 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
126a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
126b0 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
126c0 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
126d0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
126e0 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   || !MEMDB );.  
126f0 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
12700 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12710 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
12720 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12730 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
12740 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
12750 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
12760 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
12770 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32  R.  );.  if( rc2
12780 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12790 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
127a0 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  RR ){.    pPager
127b0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
127c0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
127d0 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52  te = PAGER_ERROR
127e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
127f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
12800 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
12810 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
12820 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
12830 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
12840 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
12850 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
12860 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
12870 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
12880 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
12890 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
128a0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
128b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
128c0 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
128d0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
128e0 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
128f0 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
12900 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
12910 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
12920 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
12930 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12940 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
12950 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
12960 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
12970 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
12980 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
12990 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
129a0 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
129b0 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
129c0 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
129d0 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
129e0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
129f0 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
12a00 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
12a10 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
12a20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
12a30 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
12a40 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
12a50 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
12a60 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
12a70 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
12a80 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
12a90 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
12aa0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
12ab0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
12ac0 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
12ad0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
12ae0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
12af0 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
12b00 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
12b10 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
12b20 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
12b30 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
12b40 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
12b50 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
12b60 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
12b70 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12b80 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
12b90 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
12ba0 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
12bb0 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
12bc0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
12bd0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
12be0 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
12bf0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
12c00 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
12c10 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
12c20 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
12c30 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
12c40 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
12c50 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
12c60 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
12c70 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
12c80 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
12c90 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
12ca0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
12cb0 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
12cc0 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
12cd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
12ce0 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
12cf0 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
12d00 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
12d10 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12d20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
12d30 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
12d40 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
12d50 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
12d60 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
12d70 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
12d80 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
12d90 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
12da0 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
12db0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
12dc0 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
12dd0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
12de0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
12df0 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
12e00 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
12e10 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
12e20 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
12e30 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
12e40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12e50 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
12e60 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
12e70 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
12e80 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
12e90 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
12ea0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
12eb0 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
12ec0 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
12ed0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
12ee0 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
12ef0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
12f00 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
12f10 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
12f20 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
12f30 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
12f40 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
12f50 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
12f60 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
12f70 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
12f80 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
12f90 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
12fa0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
12fb0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
12fc0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
12fd0 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
12fe0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
12ff0 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
13000 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
13010 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
13020 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
13030 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
13040 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
13050 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
13060 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
13070 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
13080 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
13090 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
130a0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
130b0 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
130c0 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
130d0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
130e0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
130f0 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
13100 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
13110 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
13120 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
13130 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
13140 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
13150 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
13160 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
13170 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
13180 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
13190 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
131a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
131b0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
131c0 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
131d0 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
131e0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
131f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
13200 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13210 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
13220 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
13230 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
13240 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13250 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
13260 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
13270 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
13280 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
13290 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  if the pager doe
132a0 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70  s not have an op
132b0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
132c0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20  tion.  ** or at 
132d0 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
132e0 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63   lock. This func
132f0 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
13300 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20  ed when there.  
13310 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  ** is no write-t
13320 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
13330 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44  e but a RESERVED
13340 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
13350 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e   is.  ** held un
13360 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74  der two circumst
13370 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ances:.  **.  **
13380 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75     1. After a su
13390 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75  ccessful hot-jou
133a0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69  rnal rollback, i
133b0 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  t is called with
133c0 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74  .  **      eStat
133d0 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e  e==PAGER_NONE an
133e0 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
133f0 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20  VE_LOCK..  **.  
13400 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e  **   2. If a con
13410 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63  nection with loc
13420 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
13430 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45  ive holding an E
13440 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20  XCLUSIVE .  **  
13450 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65      lock switche
13460 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e  s back to lockin
13470 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e  g_mode=normal an
13480 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20  d then executes 
13490 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64  a.  **      read
134a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68  -transaction, th
134b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
134c0 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74  alled with eStat
134d0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
134e0 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65  .  **      and e
134f0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
13500 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65  LOCK when the re
13510 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
13520 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20  s closed..  */. 
13530 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
13540 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
13550 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
13560 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
13570 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
13580 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
13590 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45  tate<PAGER_WRITE
135a0 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67  R_LOCKED && pPag
135b0 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56  er->eLock<RESERV
135c0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
135d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
135e0 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41  .  }..  releaseA
135f0 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
13600 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
13610 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13620 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
13630 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
13640 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
13650 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
13660 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
13670 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
13680 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
13690 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
136a0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
136b0 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
136c0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  al(pPager->jfd) 
136d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
136e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
136f0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13700 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
13710 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13720 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13730 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
13740 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13750 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13760 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
13770 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
13780 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13790 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
137a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
137b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
137c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
137d0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
137e0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
137f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
13800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13810 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
13820 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13830 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13840 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
13850 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
13860 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
13870 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
13880 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
13890 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
138a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
138b0 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
138c0 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
138d0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
138e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
138f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13900 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
13910 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
13920 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
13930 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
13940 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
13950 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
13960 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
13970 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
13980 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
13990 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
139a0 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
139b0 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
139c0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
139d0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
139e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
139f0 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
13a00 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
13a10 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20   journal. .     
13a20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
13a30 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13a40 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13a50 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
13a60 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13a70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a80 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a90 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
13aa0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
13ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13ac0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13ad0 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
13ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13af0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13b00 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
13b10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
13b20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13b30 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13b40 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13b50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13b60 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13b70 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13b80 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13b90 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13ba0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13bb0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13bc0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13bd0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13be0 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13bf0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13c00 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13c10 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13c20 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13c30 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13c40 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13c50 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13c60 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13c70 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13c90 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13ca0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
13cb0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
13cc0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
13cd0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
13ce0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
13cf0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
13d00 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
13d10 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
13d20 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
13d30 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
13d40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
13d50 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
13d60 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
13d70 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
13d80 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
13d90 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
13da0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
13db0 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
13dc0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
13dd0 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
13de0 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
13df0 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
13e00 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
13e10 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
13e20 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
13e30 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
13e40 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
13e50 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
13e60 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
13e70 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
13e80 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   );.  }.  if( !p
13e90 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
13ea0 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61  Mode .   && (!pa
13eb0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
13ec0 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45  ) || sqlite3WalE
13ed0 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
13ee0 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20  ger->pWal, 0)). 
13ef0 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61   ){.    rc2 = pa
13f00 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
13f10 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
13f20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
13f30 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
13f40 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
13f50 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
13f60 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72  READER;.  pPager
13f70 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
13f80 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
13f90 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63  SQLITE_OK?rc2:rc
13fa0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
13fb0 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
13fc0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
13fd0 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
13fe0 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
13ff0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
14000 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
14010 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
14020 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
14030 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
14040 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
14050 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
14060 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
14070 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
14080 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
14090 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
140a0 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
140b0 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
140c0 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
140d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
140e0 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70  e and move the p
140f0 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45  ager back to OPE
14100 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73  N state. If this
14110 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20   .** means that 
14120 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
14130 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
14140 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
14150 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e  the next .** con
14160 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69  nection to obtai
14170 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
14180 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68  on the pager (wh
14190 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20  ich may be this 
141a0 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f  one) .** will ro
141b0 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  ll it back..**.*
141c0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
141d0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  as not already e
141e0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
141f0 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49   state, but an I
14200 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65  O or.** malloc e
14210 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14220 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
14230 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74  hen this will it
14240 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74  self cause .** t
14250 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65  he pager to ente
14260 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  r the ERROR stat
14270 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65  e. Which will be
14280 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a   cleared by the.
14290 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  ** call to pager
142a0 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65  _unlock(), as de
142b0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a  scribed above..*
142c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
142d0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
142e0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
142f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
14300 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
14310 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72  _ERROR && pPager
14320 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14330 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65  OPEN ){.    asse
14340 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
14350 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
14360 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14370 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
14380 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
14390 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
143a0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
143b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
143c0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
143d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ager);.      sql
143e0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
143f0 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65  loc();.    }else
14400 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
14410 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
14420 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14430 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
14440 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20  ER_READER );.   
14450 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61     pager_end_tra
14460 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14470 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   0);.    }.  }. 
14480 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
14490 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
144a0 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20  Parameter aData 
144b0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
144c0 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72  buffer of pPager
144d0 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
144e0 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d  .** of data. Com
144f0 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
14500 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64  a checksum based
14510 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   ont the content
14520 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  s of the .** pag
14530 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68  e of data and th
14540 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
14550 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of pPager->cksum
14560 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  Init..**.** This
14570 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
14580 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72  hecksum. It is r
14590 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
145a0 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
145b0 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
145c0 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  ue (pPager->cksu
145d0 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79  mInit) and every
145e0 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f   200th byte.** o
145f0 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c  f the page data,
14600 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62   starting with b
14610 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67  yte offset (pPag
14620 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30  er->pageSize%200
14630 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20  )..** Each byte 
14640 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
14650 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67  s an 8-bit unsig
14660 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a  ned integer..**.
14670 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  ** Changing the 
14680 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20  formula used to 
14690 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65  compute this che
146a0 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e  cksum results in
146b0 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69   an.** incompati
146c0 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ble journal file
146d0 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49   format..**.** I
146e0 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  f journal corrup
146f0 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
14700 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
14710 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
14720 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f  ely .** scenario
14730 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
14740 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
14750 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
14760 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a   be changed. .**
14770 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73   It is much less
14780 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
14790 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
147a0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
147b0 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
147c0 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
147d0 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
147e0 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
147f0 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
14800 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
14810 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
14820 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
14830 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
14840 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
14850 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
14860 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
14870 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
14880 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
14890 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
148a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ;         /* Che
148b0 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72  cksum value to r
148c0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
148d0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
148e0 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20  ize-200;        
148f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
14900 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e  r */.  while( i>
14910 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
14920 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
14930 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
14940 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
14950 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
14960 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
14970 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
14980 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
14990 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
149a0 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
149b0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
149c0 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
149d0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
149e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
149f0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
14a00 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
14a10 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
14a20 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
14a30 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
14a40 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
14a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a60 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
14a70 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
14a80 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
14a90 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
14aa0 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
14ab0 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
14ac0 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
14ad0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
14ae0 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
14af0 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
14b00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14b10 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
14b20 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
14b30 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
14b40 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
14b50 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
14b60 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
14b70 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
14b80 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
14b90 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
14ba0 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
14bb0 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
14bc0 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
14bd0 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
14be0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
14bf0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72  **.** The main r
14c00 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
14c10 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d  uses checksums -
14c20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
14c30 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20  ournal does .** 
14c40 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
14c50 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
14c60 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
14c70 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
14c80 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
14c90 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
14ca0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
14cb0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
14cc0 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
14cd0 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
14ce0 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
14cf0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
14d00 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
14d10 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
14d20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
14d30 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
14d40 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
14d50 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
14d60 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
14d70 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
14d80 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
14d90 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
14da0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
14db0 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
14dc0 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
14dd0 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
14de0 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
14df0 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
14e00 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
14e10 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
14e20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
14e30 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
14e40 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
14e50 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
14e60 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
14e70 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
14e80 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
14e90 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
14ea0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
14eb0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
14ec0 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
14ed0 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
14ee0 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
14ef0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
14f00 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
14f10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14f20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
14f30 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
14f40 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
14f50 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
14f60 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
14f70 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
14f80 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
14f90 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
14fa0 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
14fb0 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
14fc0 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
14fd0 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
14fe0 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
14ff0 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
15000 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
15010 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
15020 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
15030 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
15040 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
15050 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
15060 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
15070 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
15080 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
15090 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
150a0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
150b0 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
150c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
150d0 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
150e0 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
150f0 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
15100 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
15110 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
15120 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
15130 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
15140 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
15150 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
15160 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
15170 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
15180 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
15190 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
151a0 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
151b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
151c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
151d0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
151e0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
151f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
15200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15210 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
15220 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
15230 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
15240 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
15250 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
15260 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
15270 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
15280 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20  pDone,          
15290 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
152a0 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
152b0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
152c0 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c    int isMainJrnl
152d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
152e0 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75  /* 1 -> main jou
152f0 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a  rnal. 0 -> sub-j
15300 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74  ournal. */.  int
15310 20 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20   isSavepnt      
15320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15330 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
15340 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29  nt rollback */.)
15350 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
15360 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
15370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15380 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
15390 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
153a0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153c0 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
153d0 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
153e0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
153f0 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
15400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
15410 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
15420 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
15430 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61  */.  char *aData
15440 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15450 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20     /* Temporary 
15460 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20  storage for the 
15470 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
15480 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20  3_file *jfd;    
15490 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
154a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
154b0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  or the journal f
154c0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  ile */.  int isS
154d0 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20  ynced;          
154e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
154f0 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  f journal page i
15500 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61  s synced */..  a
15510 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
15520 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
15530 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
15540 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
15550 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
15560 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
15570 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
15580 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15590 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
155a0 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
155b0 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
155c0 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
155d0 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
155e0 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
155f0 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
15600 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
15610 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
15620 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
15630 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
15640 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44  ce;.  assert( aD
15650 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f  ata );         /
15660 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d  * Temp storage m
15670 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
15680 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
15690 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  */.  assert( pag
156a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
156b0 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a  ==0 || (!isMainJ
156c0 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74  rnl && isSavepnt
156d0 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65  ) );..  /* Eithe
156e0 72 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67  r the state is g
156f0 72 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45  reater than PAGE
15700 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
15710 44 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  D (a transaction
15720 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f   .  ** or savepo
15730 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e  int rollback don
15740 65 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74  e at the request
15750 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20   of the caller) 
15760 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20  or this is.  ** 
15770 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15780 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73  llback. If it is
15790 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
157a0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67  ollback, the pag
157b0 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74  er.  ** is in st
157c0 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c  ate OPEN and hol
157d0 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ds an EXCLUSIVE 
157e0 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61  lock. Hot-journa
157f0 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  l rollback.  ** 
15800 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20  only reads from 
15810 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15820 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f  , not the sub-jo
15830 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
15840 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
15850 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
15860 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
15870 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
15880 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
15890 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  N && pPager->eLo
158a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
158b0 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  CK).  );.  asser
158c0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
158d0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
158e0 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61  CACHEMOD || isMa
158f0 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20  inJrnl );..  /* 
15900 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
15910 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
15920 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
15930 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
15940 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
15950 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
15960 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
15970 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
15980 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
15990 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
159a0 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
159b0 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
159c0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
159d0 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
159e0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
159f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
15a00 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
15a10 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
15a20 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
15a30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
15a40 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20  (*pOffset)+4);. 
15a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15a60 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
15a70 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50    *pOffset += pP
15a80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b  ager->pageSize +
15a90 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a   4 + isMainJrnl*
15aa0 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
15ab0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
15ac0 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
15ad0 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
15ae0 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
15af0 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
15b00 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
15b10 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
15b20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
15b30 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
15b40 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
15b50 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
15b60 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
15b70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
15b80 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
15b90 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
15ba0 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
15bb0 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
15bc0 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
15bd0 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
15be0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
15bf0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
15c00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15c10 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20  !isSavepnt );.  
15c20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15c30 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
15c40 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
15c50 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c  r->dbSize || sql
15c60 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
15c70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  Done, pgno) ){. 
15c80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15c90 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
15ca0 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
15cb0 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
15cc0 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29  (jfd, (*pOffset)
15cd0 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  -4, &cksum);.   
15ce0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
15cf0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73   rc;.    if( !is
15d00 53 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72  Savepnt && pager
15d10 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
15d20 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75  u8*)aData)!=cksu
15d30 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
15d40 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
15d50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
15d60 66 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20  f this page has 
15d70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
15d80 79 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75  yed by before du
15d90 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
15da0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
15db0 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
15dc0 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
15dd0 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
15de0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
15df0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
15e00 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
15e10 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
15e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15e30 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
15e40 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
15e50 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
15e60 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
15e70 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
15e80 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
15e90 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
15ea0 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
15eb0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15ec0 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
15ed0 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
15ee0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
15ef0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15f00 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
15f10 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
15f20 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
15f30 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
15f40 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
15f50 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
15f60 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
15f70 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
15f80 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
15f90 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
15fa0 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
15fb0 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
15fc0 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
15fd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
15fe0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
15ff0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
16000 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
16010 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
16020 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
16030 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
16040 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16050 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
16060 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
16070 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
16080 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
16090 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
160a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
160b0 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
160c0 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
160d0 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
160e0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
160f0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
16100 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
16110 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
16120 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
16130 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
16140 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
16150 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
16160 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
16170 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
16180 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
16190 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
161a0 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
161b0 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
161c0 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
161d0 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
161e0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
161f0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
16200 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
16210 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
16220 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
16230 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
16240 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
16250 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
16260 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
16270 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
16280 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
16290 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
162a0 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
162b0 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
162c0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
162d0 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
162e0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
162f0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
16300 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
16310 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
16320 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
16330 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
16340 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
16350 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
16360 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
16370 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
16380 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
16390 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
163a0 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
163b0 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
163c0 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
163d0 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
163e0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
163f0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
16400 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
16410 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
16420 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
16430 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
16440 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
16450 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
16460 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
16470 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
16480 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
16490 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
164a0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
164b0 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
164c0 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
164d0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
164e0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
164f0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
16500 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
16510 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
16520 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
16530 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
16540 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
16550 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16560 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
16570 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
16580 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
16590 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
165a0 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
165b0 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
165c0 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
165d0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
165e0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
165f0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
16600 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
16610 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
16620 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
16630 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
16640 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
16650 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
16660 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
16670 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
16680 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
16690 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
166a0 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
166b0 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
166c0 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
166d0 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
166e0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
166f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
16700 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
16710 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
16720 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16730 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
16740 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
16750 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
16760 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
16770 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
16780 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29   pPg || !MEMDB )
16790 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
167a0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
167b0 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30  R_OPEN || pPg==0
167c0 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
167d0 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  (("PLAYBACK %d p
167e0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
167f0 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ) %s\n",.       
16800 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
16810 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
16820 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
16830 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a  ->pageSize, (u8*
16840 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20  )aData),.       
16850 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f      (isMainJrnl?
16860 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22  "main-journal":"
16870 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20  sub-journal").  
16880 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e  ));.  if( isMain
16890 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79  Jrnl ){.    isSy
168a0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e  nced = pPager->n
168b0 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73  oSync || (*pOffs
168c0 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  et <= pPager->jo
168d0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c  urnalHdr);.  }el
168e0 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64  se{.    isSynced
168f0 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d   = (pPg==0 || 0=
16900 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  =(pPg->flags & P
16910 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
16920 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70  ;.  }.  if( isOp
16930 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
16940 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
16950 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
16960 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
16970 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
16980 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73  R_OPEN).   && is
16990 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
169a0 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
169b0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
169c0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
169d0 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
169e0 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
169f0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
16a00 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
16a10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
16a20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
16a30 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
16a40 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
16a50 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
16a60 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
16a70 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
16a80 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
16a90 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
16aa0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16ab0 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
16ac0 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
16ad0 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
16ae0 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
16af0 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
16b00 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
16b10 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
16b20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
16b30 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
16b40 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
16b50 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
16b60 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
16b70 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
16b80 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
16b90 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
16ba0 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
16bb0 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
16bc0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
16bd0 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
16be0 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
16bf0 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
16c00 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
16c10 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16c20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
16c30 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
16c40 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
16c50 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
16c60 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
16c70 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
16c80 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
16c90 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
16ca0 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
16cb0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
16cc0 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
16cd0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
16ce0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
16cf0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
16d00 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
16d10 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
16d20 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
16d30 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
16d40 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
16d50 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
16d60 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
16d70 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
16d80 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
16d90 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
16da0 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
16db0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
16dc0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
16dd0 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
16de0 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
16df0 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
16e00 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
16e10 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
16e20 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
16e30 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
16e40 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
16e50 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
16e60 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
16e70 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
16e80 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16e90 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
16ea0 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
16eb0 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
16ec0 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
16ed0 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
16ee0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
16ef0 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
16f00 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
16f10 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
16f20 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
16f30 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
16f40 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
16f50 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
16f60 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
16f70 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
16f80 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
16f90 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
16fa0 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
16fb0 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
16fc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16fd0 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
16fe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
16ff0 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
17000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17010 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17020 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
17030 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
17040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
17050 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
17060 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17070 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17080 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17090 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
170a0 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
170b0 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
170c0 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
170d0 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
170e0 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
170f0 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
17100 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
17110 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
17120 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
17130 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
17140 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
17150 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
17160 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17170 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17180 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17190 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
171a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
171b0 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
171c0 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
171d0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
171e0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
171f0 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
17200 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
17210 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
17220 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
17230 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
17240 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
17250 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
17260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17270 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17280 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17290 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
172a0 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
172b0 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
172c0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
172d0 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
172e0 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
172f0 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17300 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
17310 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
17320 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
17330 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
17340 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
17350 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
17360 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17370 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17380 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17390 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
173a0 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
173b0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
173c0 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
173d0 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
173e0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
173f0 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17400 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
17410 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
17420 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
17430 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
17440 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
17450 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
17460 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17470 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17480 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17490 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
174a0 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
174b0 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
174c0 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
174d0 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
174e0 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
174f0 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17500 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17510 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17520 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17530 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17540 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17550 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17560 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17570 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17580 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17590 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
175a0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
175b0 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
175c0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
175d0 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
175e0 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
175f0 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17600 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17610 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17620 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17630 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17640 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17650 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17660 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17680 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17690 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
176a0 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
176b0 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
176c0 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
176d0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
176e0 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
176f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17700 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17710 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17720 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17730 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17740 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17750 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17760 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17770 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17780 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17790 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
177a0 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
177b0 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
177c0 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
177d0 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
177e0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
177f0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17800 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
17810 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
17820 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17830 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17840 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17850 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17860 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17870 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17880 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17890 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
178a0 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
178b0 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
178c0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
178d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
178e0 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
178f0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
17900 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17910 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
17920 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
17930 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17940 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17950 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17960 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17970 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17980 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17990 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
179a0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
179b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
179c0 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
179d0 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
179e0 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
179f0 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17a00 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17a10 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17a20 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17a30 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17a40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17a50 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17a60 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
17a70 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
17a80 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
17a90 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
17aa0 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
17ab0 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
17ac0 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
17ad0 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
17ae0 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
17af0 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
17b00 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
17b10 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
17b20 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
17b30 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
17b40 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
17b50 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
17b60 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
17b70 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
17b80 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
17b90 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
17ba0 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
17bb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
17bc0 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
17bd0 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
17be0 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
17bf0 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
17c00 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
17c10 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
17c20 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
17c30 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
17c40 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
17c50 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
17c60 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17c70 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
17c80 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
17c90 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
17ca0 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
17cb0 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
17cc0 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
17cd0 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
17ce0 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
17cf0 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
17d00 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
17d10 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
17d20 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
17d30 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
17d40 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
17d50 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
17d60 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
17d70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
17d80 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
17d90 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
17da0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
17db0 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
17dc0 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
17dd0 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
17de0 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
17df0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
17e00 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
17e10 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
17e20 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
17e30 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
17e40 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
17e50 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
17e60 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
17e70 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
17e80 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
17e90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
17ea0 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
17eb0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
17ec0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
17ed0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
17ee0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
17ef0 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
17f00 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
17f10 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
17f20 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
17f30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
17f40 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
17f50 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
17f60 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
17f70 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
17f80 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17f90 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
17fa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
17fb0 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
17fc0 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
17fd0 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
17fe0 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
17ff0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18000 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
18010 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
18020 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
18030 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
18040 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
18050 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
18060 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18070 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18080 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
180a0 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
180b0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
180c0 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
180d0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
180e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
180f0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
18100 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
18110 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
18120 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
18130 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18140 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
18150 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
18160 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18170 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18180 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18190 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
181a0 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
181b0 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
181c0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
181d0 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
181e0 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
181f0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
18200 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
18210 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
18220 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
18230 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
18240 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
18250 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
18260 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18270 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18280 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18290 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
182a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
182b0 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
182c0 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
182d0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
182e0 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
182f0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18300 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
18310 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
18320 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
18330 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
18340 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
18350 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
18360 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18370 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18380 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18390 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
183a0 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
183b0 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
183c0 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
183d0 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
183e0 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
183f0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18400 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
18410 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18420 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
18430 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
18440 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
18450 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18460 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18470 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18480 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18490 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
184a0 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
184b0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
184c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
184d0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
184e0 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
184f0 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18500 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18510 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18520 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18530 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18540 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18550 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18560 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18570 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18580 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18590 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
185a0 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
185b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
185c0 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
185d0 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
185e0 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
185f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18600 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18610 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18620 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18630 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18640 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18650 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18660 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18670 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18680 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18690 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
186a0 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
186b0 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
186c0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
186d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
186e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
186f0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18700 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18710 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18720 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18730 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18740 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18750 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18760 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18770 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18780 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18790 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
187a0 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
187b0 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
187c0 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
187d0 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
187e0 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
187f0 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
18800 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
18810 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18820 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
18830 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18840 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18850 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18860 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18870 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18890 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
188a0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
188b0 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
188c0 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
188d0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
188e0 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
188f0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18900 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
18910 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
18920 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
18930 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18940 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18950 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18960 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18970 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18980 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18990 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
189a0 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
189b0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
189c0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
189d0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
189e0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
189f0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18a00 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18a10 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18a20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18a40 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18a50 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18a60 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
18a70 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
18a80 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
18a90 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
18aa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
18ab0 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
18ac0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18ad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18ae0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18af0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18b00 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
18b10 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
18b20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
18b30 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
18b40 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
18b50 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
18b60 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
18b70 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
18b80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18b90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
18ba0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18bc0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
18bd0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18be0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
18bf0 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
18c00 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
18c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
18c20 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
18c30 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
18c40 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
18c50 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
18c60 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
18c70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
18c80 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
18c90 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
18ca0 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
18cb0 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
18cc0 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
18cd0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18ce0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
18cf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
18d00 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
18d10 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
18d20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
18d30 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
18d40 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
18d50 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
18d60 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
18d70 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
18d80 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
18d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
18da0 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
18db0 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
18dc0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
18dd0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
18de0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
18df0 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
18e00 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
18e10 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
18e20 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
18e30 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18e40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
18e50 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
18e60 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
18e70 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
18e80 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
18e90 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
18ea0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
18eb0 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
18ec0 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
18ed0 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
18ee0 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
18ef0 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
18f00 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
18f10 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
18f20 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
18f30 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
18f40 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
18f50 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
18f60 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
18f70 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
18f80 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
18f90 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
18fa0 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
18fb0 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
18fc0 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
18fd0 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
18fe0 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
18ff0 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
19000 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
19010 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
19020 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
19030 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
19040 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
19050 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
19060 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19080 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19090 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
190a0 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
190b0 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
190c0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
190d0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
190e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
190f0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19100 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19110 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
19120 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19130 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19140 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19150 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
19160 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19170 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19180 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19190 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
191a0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
191b0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
191c0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
191d0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
191e0 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
191f0 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19200 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
19210 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
19220 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
19230 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19240 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
19250 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
19260 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19270 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19280 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19290 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
192a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
192b0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
192c0 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
192d0 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
192e0 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
192f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19300 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
19310 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
19320 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
19330 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
19340 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19350 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
19360 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19370 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
19380 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
19390 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
193a0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
193b0 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
193c0 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
193d0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
193e0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3c 20 20  Size-szPage) <  
193f0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
19400 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19410 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
19420 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65  ) == currentSize
19430 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
19440 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
19450 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e  zPage) >  curren
19460 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
19470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
19480 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
19490 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e   pTmp, szPage, n
194a0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a  ewSize-szPage);.
194b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
194c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
194d0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
194e0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
194f0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  nPage;.      }. 
19500 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19510 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
19520 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
19530 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  the Pager.sector
19540 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f  Size variable fo
19550 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70  r the given.** p
19560 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68  ager based on th
19570 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
19580 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
19590 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66  ize method.** of
195a0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
195b0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63  se file. The sec
195c0 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
195d0 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20 74   used used .** t
195e0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
195f0 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65  size and alignme
19600 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  nt of journal he
19610 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73  ader and .** mas
19620 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
19630 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61  ters within crea
19640 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ted journal file
19650 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
19660 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65  porary files the
19670 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
19680 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73  r size is always
19690 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a   512 bytes..**.*
196a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72  * Otherwise, for
196b0 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66   non-temporary f
196c0 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74  iles, the effect
196d0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
196e0 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  is.** the value 
196f0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
19700 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65  xSectorSize() me
19710 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20  thod rounded up 
19720 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69  to 32 if.** it i
19730 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20  s less than 32, 
19740 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20  or rounded down 
19750 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  to MAX_SECTOR_SI
19760 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67  ZE if it.** is g
19770 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f  reater than MAX_
19780 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
19790 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
197a0 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
197b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
197c0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
197d0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
197e0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
197f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
19800 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  mpFile ){.    /*
19810 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
19820 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
19830 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
19840 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
19850 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
19860 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
19870 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
19880 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
19890 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
198a0 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
198b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
198c0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
198d0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
198e0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
198f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
19900 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33  er->sectorSize<3
19910 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  2 ){.    pPager-
19920 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31  >sectorSize = 51
19930 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  2;.  }.  if( pPa
19940 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
19950 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
19960 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d  ){.    assert( M
19970 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d  AX_SECTOR_SIZE>=
19980 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65  512 );.    pPage
19990 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
199a0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  MAX_SECTOR_SIZE;
199b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
199c0 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
199d0 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
199e0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
199f0 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
19a00 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
19a10 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
19a20 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
19a30 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
19a40 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
19a50 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
19a60 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
19a70 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
19a80 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
19a90 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
19aa0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
19ab0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
19ac0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
19ad0 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
19ae0 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
19af0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
19b00 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
19b10 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
19b20 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
19b30 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
19b40 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
19b50 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
19b60 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
19b70 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
19b80 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19b90 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
19ba0 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
19bb0 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
19bc0 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
19bd0 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
19be0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
19bf0 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
19c00 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
19c10 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
19c20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
19c30 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
19c40 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19c50 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19c60 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
19c70 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
19c80 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
19c90 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
19ca0 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
19cb0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
19cc0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
19cd0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
19ce0 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
19cf0 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
19d00 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
19d10 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
19d20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
19d30 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
19d40 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
19d50 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
19d60 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
19d70 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
19d80 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
19d90 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
19da0 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
19db0 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
19dc0 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
19dd0 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
19de0 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
19df0 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
19e00 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
19e10 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
19e20 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
19e30 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
19e40 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
19e50 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
19e60 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
19e70 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
19e80 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
19e90 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
19ea0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
19eb0 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
19ec0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
19ed0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
19ee0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
19ef0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
19f00 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
19f10 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
19f20 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
19f30 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
19f40 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
19f50 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
19f60 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
19f70 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
19f80 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
19f90 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
19fa0 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
19fb0 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
19fc0 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
19fd0 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
19fe0 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
19ff0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1a000 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1a010 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1a020 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1a030 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1a040 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1a050 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1a060 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1a070 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1a080 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1a090 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1a0a0 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1a0b0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1a0c0 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1a0d0 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1a0e0 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1a0f0 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1a100 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1a110 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1a120 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1a130 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1a140 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1a150 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1a160 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1a170 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1a180 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1a190 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1a1a0 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1a1b0 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1a1c0 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1a1d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1a1e0 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1a1f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a200 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1a210 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1a220 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1a230 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1a240 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1a250 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1a260 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1a270 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1a280 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1a290 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1a2a0 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1a2b0 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1a2c0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1a2d0 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1a2e0 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1a2f0 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1a300 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1a310 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1a320 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1a330 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1a340 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1a350 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1a360 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1a370 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1a380 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1a390 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1a3a0 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1a3b0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1a3c0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1a3d0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1a3e0 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1a3f0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1a400 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1a410 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1a420 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1a430 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1a440 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1a450 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1a460 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1a470 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1a480 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1a490 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1a4a0 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1a4b0 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1a4c0 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1a4d0 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1a4e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a4f0 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1a500 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1a510 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1a520 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1a530 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1a540 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1a550 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1a560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a570 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1a580 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1a590 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a5a0 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1a5b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1a5c0 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1a5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1a5e0 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1a5f0 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1a600 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1a610 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1a620 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1a630 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1a640 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1a650 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1a660 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1a670 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1a680 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1a690 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1a6a0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1a6b0 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1a6c0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1a6d0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1a6e0 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1a6f0 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1a700 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1a710 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1a720 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1a730 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1a740 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1a750 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
1a760 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
1a770 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
1a780 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
1a790 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
1a7a0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
1a7b0 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
1a7c0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1a7d0 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20  >jfd) );.  rc = 
1a7e0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
1a7f0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1a800 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
1a810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a820 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1a830 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
1a840 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
1a850 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
1a860 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
1a870 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
1a880 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
1a890 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1a8a0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
1a8b0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
1a8c0 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
1a8d0 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
1a8e0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
1a8f0 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
1a900 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
1a910 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
1a920 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20    **.  ** TODO: 
1a930 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  Technically the 
1a940 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20  following is an 
1a950 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74  error because it
1a960 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20   assumes that.  
1a970 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e  ** buffer Pager.
1a980 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78  pTmpSpace is (mx
1a990 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65  Pathname+1) byte
1a9a0 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65  s or larger. i.e
1a9b0 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61  . that.  ** (pPa
1a9c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d  ger->pageSize >=
1a9d0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1a9e0 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73  xPathname+1). Us
1a9f0 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20  ing os_unix.c,. 
1aa00 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20   **  mxPathname 
1aa10 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1aa20 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1aa30 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1aa40 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1aa50 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1aa60 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1aa70 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1aa80 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1aa90 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1aaa0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1aab0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1aac0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1aad0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1aae0 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1aaf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ab00 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1ab10 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1ab20 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1ab30 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1ab40 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1ab50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1ab60 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1ab70 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1ab80 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1ab90 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1aba0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1abb0 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1abc0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1abd0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1abe0 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1abf0 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1ac00 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1ac10 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1ac20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1ac30 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1ac40 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1ac50 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1ac60 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1ac70 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1ac80 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1ac90 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1aca0 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1acb0 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1acc0 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1acd0 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1ace0 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1acf0 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1ad00 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1ad10 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1ad20 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1ad30 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1ad40 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1ad50 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1ad60 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1ad70 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1ad80 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1ad90 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1ada0 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1adb0 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1adc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1add0 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1ade0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1adf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1ae00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1ae10 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1ae20 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1ae30 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1ae40 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1ae50 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1ae60 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1ae70 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1ae80 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1ae90 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1aea0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1aeb0 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1aec0 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1aed0 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1aee0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1aef0 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1af00 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1af10 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1af20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1af30 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1af40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1af50 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1af60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1af70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1af80 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1af90 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1afa0 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1afb0 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1afc0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1afd0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1afe0 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1aff0 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1b000 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1b010 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1b020 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1b030 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1b040 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1b050 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1b060 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1b070 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1b080 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1b090 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1b0a0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1b0b0 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1b0c0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1b0d0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1b0e0 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1b0f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b100 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1b110 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1b120 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1b130 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1b140 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1b150 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1b160 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1b170 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1b180 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1b190 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1b1a0 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1b1b0 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1b1c0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1b1d0 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1b1e0 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1b1f0 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1b200 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1b210 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1b220 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1b230 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1b240 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1b250 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1b260 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1b270 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1b280 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1b290 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1b2a0 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1b2b0 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1b2c0 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1b2d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b2e0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1b2f0 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1b300 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1b310 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1b320 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1b330 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1b340 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1b350 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1b360 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1b370 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1b380 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1b390 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1b3a0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1b3b0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1b3c0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1b3d0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1b3e0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1b3f0 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1b400 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1b410 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1b420 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1b430 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1b440 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1b450 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1b460 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1b470 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1b480 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1b490 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1b4a0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1b4b0 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1b4c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1b4e0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1b4f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1b500 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1b510 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1b520 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1b530 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1b540 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1b550 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1b560 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1b570 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1b580 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1b590 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1b5a0 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1b5b0 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1b5c0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1b5d0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1b5e0 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1b5f0 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1b600 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1b610 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1b620 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1b630 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b640 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1b650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b660 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1b670 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1b680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1b690 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1b6a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b6b0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
1b6c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1b6d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b6e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1b6f0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1b700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1b710 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
1b720 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65  as been truncate
1b730 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72  d, simply stop r
1b740 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  eading and.     
1b750 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69       ** processi
1b760 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ng the journal. 
1b770 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
1b780 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n if the journal
1b790 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a   was.          *
1b7a0 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79  * not completely
1b7b0 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e   written and syn
1b7c0 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63  ced prior to a c
1b7d0 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20  rash.  In that. 
1b7e0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
1b7f0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
1b800 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72  hould have never
1b810 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1b820 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1b830 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f  * first place so
1b840 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d   it is OK to sim
1b850 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20  ply abandon the 
1b860 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20  rollback. */.   
1b870 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1b880 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
1b890 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b8a0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ck;.        }els
1b8b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
1b8c0 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
1b8d0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75   to rollback, qu
1b8e0 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  it and return th
1b8f0 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1b900 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73    ** code.  This
1b910 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
1b920 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
1b930 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20  he error state. 
1b940 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74           ** so t
1b950 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68  hat no further h
1b960 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  arm will be done
1b970 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  .  Perhaps the n
1b980 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ext.          **
1b990 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
1b9a0 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61   along will be a
1b9b0 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ble to rollback 
1b9c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
1b9d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b9e0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1b9f0 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
1ba00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1ba10 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
1ba20 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
1ba30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
1ba40 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
1ba50 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
1ba60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ba70 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
1ba80 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
1ba90 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
1baa0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
1bab0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
1bac0 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
1bad0 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
1bae0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
1baf0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
1bb00 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
1bb10 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
1bb20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1bb30 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
1bb40 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
1bb50 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
1bb60 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
1bb70 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
1bb80 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1bb90 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
1bba0 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1bbb0 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
1bbc0 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
1bbd0 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1bbe0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1bbf0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1bc00 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1bc10 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1bc20 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1bc30 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1bc40 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1bc50 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1bc60 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1bc70 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1bc80 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1bc90 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1bca0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1bcb0 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1bcc0 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1bcd0 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1bce0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1bcf0 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1bd00 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1bd10 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1bd20 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1bd30 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1bd40 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1bd50 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1bd60 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1bd70 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1bd80 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1bd90 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1bda0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1bdb0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1bdc0 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1bdd0 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1bde0 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1bdf0 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1be00 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1be10 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1be20 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1be30 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1be40 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1be50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1be60 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1be70 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1be80 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1be90 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1bea0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1beb0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1bec0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1bed0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1bee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1bef0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1bf00 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1bf10 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1bf20 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1bf30 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1bf40 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1bf50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1bf60 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1bf70 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1bf80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bf90 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1bfa0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1bfb0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1bfc0 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20  [0]!='\0');.    
1bfd0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1bfe0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1bff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c000 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1c010 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1c020 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1c030 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1c040 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1c050 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1c060 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1c070 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1c080 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1c090 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1c0a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1c0b0 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1c0c0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1c0d0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c0e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c0f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1c100 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
1c110 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61   variable may ha
1c120 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20  ve been updated 
1c130 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20  while rolling.  
1c140 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ** back a journa
1c150 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  l created by a p
1c160 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69  rocess with a di
1c170 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73  fferent sector s
1c180 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  ize.  ** value. 
1c190 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
1c1a0 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
1c1b0 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
1c1c0 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72    */.  setSector
1c1d0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
1c1e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c1f0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1c200 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70  ntent for page p
1c210 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
1c220 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1c230 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44  into .** pPg->pD
1c240 61 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f  ata. A shared lo
1c250 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75  ck or greater mu
1c260 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  st be held on th
1c270 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1c280 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  le before this f
1c290 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1c2a0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  d..**.** If page
1c2b0 20 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e   1 is read, then
1c2c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
1c2d0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d  ger.dbFileVers[]
1c2e0 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68   is set to.** th
1c2f0 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
1c300 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1c310 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ile..**.** If an
1c320 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1c330 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1c340 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
1c350 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
1c360 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  * Otherwise, SQL
1c370 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1c380 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1c390 74 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48  t readDbPage(PgH
1c3a0 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
1c3b0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c3c0 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65  >pPager; /* Page
1c3d0 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61  r object associa
1c3e0 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50  ted with page pP
1c3f0 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  g */.  Pgno pgno
1c400 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20   = pPg->pgno;   
1c410 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1c420 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20  er to read */.  
1c430 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1c440 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
1c450 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1c460 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30   int isInWal = 0
1c470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c480 20 54 72 75 65 20 69 66 20 70 61 67 65 20 69 73   True if page is
1c490 20 69 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a   in log file */.
1c4a0 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1c4b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1c4c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1c4d0 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1c4e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c4f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1c500 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1c510 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1c520 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1c530 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
1c540 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1c550 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
1c560 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
1c570 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
1c580 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1c590 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c5a0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1c5b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1c5c0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1c5d0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1c5e0 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1c5f0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1c600 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1c610 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1c620 6c 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61  lite3WalRead(pPa
1c630 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c  ger->pWal, pgno,
1c640 20 26 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c   &isInWal, pgsz,
1c650 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1c660 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1c670 54 45 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61  TE_OK && !isInWa
1c680 6c 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66  l ){.    i64 iOf
1c690 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a  fset = (pgno-1)*
1c6a0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1c6b0 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
1c6c0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1c6d0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
1c6e0 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66  Data, pgsz, iOff
1c6f0 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  set);.    if( rc
1c700 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1c710 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c730 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
1c740 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1c750 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1c760 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1c770 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1c780 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1c790 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1c7a0 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1c7b0 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1c7c0 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1c7d0 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1c7e0 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1c7f0 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1c800 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1c810 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1c820 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1c830 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1c840 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1c850 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1c860 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1c870 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1c880 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1c890 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1c8a0 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1c8b0 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1c8c0 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1c8d0 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1c8e0 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1c8f0 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1c900 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1c910 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1c920 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1c930 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1c940 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1c950 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1c960 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1c970 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1c980 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1c990 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1c9a0 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1c9b0 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
1c9c0 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1c9d0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1c9e0 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1c9f0 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1ca00 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1ca10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1ca20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1ca30 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1ca40 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1ca50 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1ca60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ca70 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1ca80 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1ca90 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1caa0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1cab0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1cac0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1cad0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1cae0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1caf0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1cb00 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
1cb10 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
1cb20 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
1cb30 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1cb40 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1cb50 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1cb60 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1cb70 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1cb80 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1cb90 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1cba0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1cbb0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1cbc0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1cbd0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1cbe0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1cbf0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cc00 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1cc10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1cc20 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1cc30 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1cc40 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1cc50 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1cc60 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1cc70 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1cc80 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1cc90 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1cca0 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1ccb0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1ccc0 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1ccd0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1cce0 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1ccf0 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1cd00 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1cd10 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1cd20 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1cd30 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1cd40 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1cd50 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1cd60 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1cd70 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1cd80 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1cd90 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1cda0 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1cdb0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1cdc0 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1cdd0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1cde0 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1cdf0 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1ce00 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1ce10 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1ce20 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1ce30 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1ce40 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1ce50 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1ce60 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1ce70 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1ce80 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1ce90 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1cea0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1ceb0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1cec0 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1ced0 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1cee0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1cef0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1cf00 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1cf10 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1cf20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1cf30 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1cf40 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1cf50 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1cf60 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1cf70 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1cf80 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1cf90 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1cfa0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1cfb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cfc0 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1cfd0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1cfe0 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1cff0 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1d000 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1d010 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1d020 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1d030 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1d040 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1d050 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1d060 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1d070 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1d080 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1d090 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1d0a0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1d0b0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1d0c0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1d0d0 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1d0e0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1d0f0 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1d100 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1d110 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1d120 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1d130 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1d140 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1d150 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1d160 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1d170 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1d180 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1d190 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1d1a0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1d1b0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1d1c0 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1d1d0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1d1e0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1d1f0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1d200 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1d210 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1d220 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1d230 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1d240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d250 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1d260 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1d270 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1d280 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33  .  pPg = sqlite3
1d290 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67  PagerLookup(pPag
1d2a0 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20  er, iPg);.  if( 
1d2b0 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73  pPg ){.    if( s
1d2c0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
1d2d0 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31  Refcount(pPg)==1
1d2e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d2f0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1d300 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d310 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1d320 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
1d330 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d340 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1d350 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
1d360 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d370 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1d380 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ref(pPg);.    }.
1d390 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1d3a0 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1d3b0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1d3c0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1d3d0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1d3e0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1d3f0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1d400 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1d410 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1d420 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1d430 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1d440 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1d450 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1d460 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1d470 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1d480 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1d490 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1d4a0 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1d4b0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1d4c0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1d4d0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1d4e0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1d4f0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1d500 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1d510 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1d520 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1d530 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1d540 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1d550 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1d560 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1d570 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1d580 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1d590 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1d5a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d5b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d5c0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1d5d0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1d5e0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1d5f0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1d600 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1d610 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1d620 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d650 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1d660 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1d670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1d680 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1d690 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1d6a0 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1d6b0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1d6c0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1d6d0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1d6e0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1d6f0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1d700 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1d710 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1d720 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1d730 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1d740 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1d750 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1d760 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1d770 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1d780 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1d790 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1d7a0 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1d7b0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1d7c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1d7d0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1d7e0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1d7f0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1d800 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1d810 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1d820 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1d830 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1d840 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1d850 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1d860 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1d870 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1d880 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1d890 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1d8a0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1d8b0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1d8c0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1d8d0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1d8e0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1d8f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1d900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1d910 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1d920 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1d930 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1d940 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1d950 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1d960 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1d970 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1d980 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1d990 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1d9a0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1d9b0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1d9c0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1d9d0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1d9e0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1d9f0 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1da00 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1da10 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1da20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1da30 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1da40 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1da50 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1da60 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1da70 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1da80 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1da90 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1daa0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1dab0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1dac0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1dad0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1dae0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1daf0 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1db10 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1db20 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1db30 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1db40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1db50 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1db60 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1db70 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1db80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db90 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1dba0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1dbb0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 46 6c 61 67  /.  int syncFlag
1dbc0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1dbd0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1dbe0 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1dbf0 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1dc00 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1dc30 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1dc40 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1dc50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48  efined(SQLITE_CH
1dc60 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48  ECK_PAGES).  PgH
1dc70 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc90 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1dca0 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66   pages */.#endif
1dcb0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1dcc0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 23 69 66 64  er->pWal );.#ifd
1dcd0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1dce0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
1dcf0 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69   the page list i
1dd00 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
1dd10 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d  rder */.  for(p=
1dd20 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70  pList; p && p->p
1dd30 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72  Dirty; p=p->pDir
1dd40 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ty){.    assert(
1dd50 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44   p->pgno < p->pD
1dd60 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  irty->pgno );.  
1dd70 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
1dd80 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
1dd90 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e  /* If a WAL tran
1dda0 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
1ddb0 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72   committed, ther
1ddc0 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  e is no point in
1ddd0 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20   writing.    ** 
1dde0 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20 70  any pages with p
1ddf0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1de00 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61  ter than nTrunca
1de10 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20  te into the WAL 
1de20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  file..    ** The
1de30 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
1de40 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65  read by any clie
1de50 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68  nt. So remove th
1de60 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72  em from the pDir
1de70 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68  ty.    ** list h
1de80 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64  ere. */.    PgHd
1de90 72 20 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20  r *p;.    PgHdr 
1dea0 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73  **ppNext = &pLis
1deb0 74 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  t;.    for(p=pLi
1dec0 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d 20 70  st; (*ppNext = p
1ded0 29 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  ); p=p->pDirty){
1dee0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
1def0 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 20  no<=nTruncate ) 
1df00 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69  ppNext = &p->pDi
1df10 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  rty;.    }.    a
1df20 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1df30 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74    }..  if( pList
1df40 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1df50 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1df60 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1df70 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1df80 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1df90 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1dfa0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1dfb0 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1dfc0 73 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 46 6c 61  sCommit, syncFla
1dfd0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1dfe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1dff0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1e000 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1e010 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1e020 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1e030 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1e040 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1e050 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1e060 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1e070 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1e080 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e090 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1e0a0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1e0b0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1e0c0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1e0d0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1e0e0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1e0f0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1e100 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1e110 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1e120 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1e130 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1e140 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1e150 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1e160 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1e170 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1e180 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1e190 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1e1a0 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1e1b0 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1e1c0 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1e1d0 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1e1e0 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1e1f0 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1e200 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1e210 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1e220 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1e230 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1e240 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1e250 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1e260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e270 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1e280 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1e290 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e2a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e2b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e2c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1e2d0 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2f0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1e300 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1e310 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1e320 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e340 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1e350 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1e360 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1e370 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1e380 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1e390 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1e3a0 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1e3b0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1e3c0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1e3d0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1e3e0 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1e3f0 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1e400 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1e410 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1e420 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1e430 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1e440 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1e450 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1e460 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1e470 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1e480 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1e490 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1e4a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1e4b0 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1e4c0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1e4d0 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1e4e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e4f0 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1e500 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1e510 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  t(pPager);.  }..
1e520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1e530 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1e540 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e550 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  lled as part of 
1e560 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66  the transition f
1e570 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a  rom PAGER_OPEN.*
1e580 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  * to PAGER_READE
1e590 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72  R state to deter
1e5a0 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mine the size of
1e5b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e5c0 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28  le.** in pages (
1e5d0 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67  assuming the pag
1e5e0 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79  e size currently
1e5f0 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
1e600 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a  .pageSize)..**.*
1e610 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * If no error oc
1e620 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  curs, SQLITE_OK 
1e630 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1e640 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e650 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70  database.** in p
1e660 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69  ages is stored i
1e670 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72  n *pnPage. Other
1e680 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63  wise, an error c
1e690 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20  ode (perhaps.** 
1e6a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
1e6b0 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20  AT) is returned 
1e6c0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1e6d0 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  eft unmodified..
1e6e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1e6f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
1e700 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
1e710 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e   *pnPage){.  Pgn
1e720 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1e730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e740 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
1e750 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
1e760 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57    /* Query the W
1e770 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f  AL sub-system fo
1e780 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  r the database s
1e790 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69  ize. The WalDbsi
1e7a0 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ze().  ** functi
1e7b0 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20  on returns zero 
1e7c0 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f  if the WAL is no
1e7d0 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67  t open (i.e. Pag
1e7e0 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a  er.pWal==0), or.
1e7f0 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61    ** if the data
1e800 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1e810 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20   available. The 
1e820 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
1e830 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61   not.  ** availa
1e840 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1e850 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74   sub-system if t
1e860 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65  he log file is e
1e870 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e  mpty or.  ** con
1e880 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63  tains no valid c
1e890 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
1e8a0 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73  tions..  */.  as
1e8b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1e8c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1e8d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e8e0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  ager->eLock>=SHA
1e8f0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  RED_LOCK || pPag
1e900 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
1e910 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69  ;.  nPage = sqli
1e920 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61  te3WalDbsize(pPa
1e930 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f  ger->pWal);..  /
1e940 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1e950 65 20 73 69 7a 65 20 77 61 73 20 6e 6f 74 20 61  e size was not a
1e960 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
1e970 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1e980 2c 0a 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ,.  ** determine
1e990 20 69 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65   it based on the
1e9a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1e9b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1e9c0 68 65 20 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  he size.  ** of 
1e9d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e9e0 65 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  e is not an inte
1e9f0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
1ea00 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20  the page-size,. 
1ea10 20 2a 2a 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74   ** round down t
1ea20 6f 20 74 68 65 20 6e 65 61 72 65 73 74 20 70 61  o the nearest pa
1ea30 67 65 2e 20 45 78 63 65 70 74 2c 20 61 6e 79 20  ge. Except, any 
1ea40 66 69 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  file larger than
1ea50 20 30 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e   0.  ** bytes in
1ea60 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65   size is conside
1ea70 72 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  red to contain a
1ea80 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
1ea90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1eaa0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34  ge==0 ){.    i64
1eab0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1eac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1ead0 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1eae0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73   bytes */.    as
1eaf0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1eb00 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1eb10 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1eb20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
1eb30 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1eb40 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
1eb50 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
1eb60 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a  Pager->fd, &n);.
1eb70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1eb80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1eb90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1eba0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ebb0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e  nPage = (Pgno)(n
1ebc0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1ebd0 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 50  ize);.    if( nP
1ebe0 61 67 65 3d 3d 30 20 26 26 20 6e 3e 30 20 29 7b  age==0 && n>0 ){
1ebf0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31  .      nPage = 1
1ec00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1ec10 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1ec20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ec30 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
1ec40 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1ec50 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
1ec60 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
1ec70 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
1ec80 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
1ec90 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
1eca0 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
1ecb0 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
1ecc0 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
1ecd0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
1ece0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
1ecf0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
1ed00 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
1ed10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1ed20 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1ed30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1ed40 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
1ed50 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
1ed60 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
1ed70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1ed80 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
1ed90 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
1eda0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1edb0 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
1edc0 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
1edd0 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
1ede0 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
1edf0 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
1ee00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1ee10 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
1ee20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ee30 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
1ee40 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
1ee50 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
1ee60 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
1ee70 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
1ee80 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
1ee90 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
1eea0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
1eeb0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
1eec0 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
1eed0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
1eee0 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
1eef0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
1ef00 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
1ef10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ef20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1ef30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1ef40 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
1ef50 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
1ef60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ef70 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
1ef80 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
1ef90 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
1efa0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
1efb0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
1efc0 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
1efd0 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
1efe0 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
1eff0 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
1f000 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
1f010 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
1f020 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
1f030 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
1f040 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
1f050 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
1f060 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1f070 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1f080 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
1f090 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
1f0a0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1f0b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1f0c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f0d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f0e0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1f0f0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1f100 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ARED_LOCK || pPa
1f110 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1f120 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
1f130 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
1f140 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
1f170 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
1f180 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20     Pgno nPage;  
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1f1b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f1c0 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
1f1d0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1f1e0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
1f1f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f200 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65  c;.    if( nPage
1f210 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
1f220 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1f230 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
1f240 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29  pPager->zWal, 0)
1f250 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20  ;.      isWal = 
1f260 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1f270 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f280 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
1f290 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
1f2a0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1f2b0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1f2c0 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
1f2d0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1f2e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f2f0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1f300 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
1f310 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1f320 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
1f330 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1f340 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1f350 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1f360 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
1f370 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
1f380 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1f390 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1f3a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
1f3b0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1f3c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
1f3d0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1f3e0 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
1f3f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1f400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1f410 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
1f420 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
1f430 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
1f440 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
1f450 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
1f460 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
1f470 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f480 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
1f490 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
1f4a0 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
1f4b0 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
1f4c0 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
1f4d0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
1f4e0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
1f4f0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
1f500 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
1f510 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
1f520 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
1f530 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
1f540 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
1f550 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
1f560 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
1f570 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
1f580 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
1f590 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
1f5a0 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
1f5b0 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
1f5c0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
1f5d0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
1f5e0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1f5f0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
1f600 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
1f610 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
1f620 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
1f630 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
1f640 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1f650 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
1f660 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1f670 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
1f680 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
1f690 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1f6a0 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
1f6b0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
1f6c0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1f6d0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
1f6e0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
1f6f0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
1f700 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
1f710 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1f720 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
1f730 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
1f740 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
1f750 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
1f760 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1f770 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
1f780 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
1f790 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
1f7a0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
1f7b0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
1f7c0 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
1f7d0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
1f7e0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
1f7f0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
1f800 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
1f810 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
1f820 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
1f830 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
1f840 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
1f850 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
1f860 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
1f870 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
1f880 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
1f890 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
1f8a0 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
1f8b0 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
1f8c0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
1f8d0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
1f8e0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
1f8f0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
1f900 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
1f910 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
1f920 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
1f930 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
1f940 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1f950 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
1f960 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
1f970 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
1f980 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
1f990 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
1f9a0 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
1f9b0 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
1f9c0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1f9d0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
1f9e0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
1f9f0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
1fa00 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
1fa10 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
1fa20 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
1fa30 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
1fa40 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1fa50 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
1fa60 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
1fa70 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
1fa80 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
1fa90 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
1faa0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
1fab0 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
1fac0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
1fad0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
1fae0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
1faf0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
1fb00 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
1fb10 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
1fb20 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
1fb30 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
1fb60 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
1fb70 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
1fb80 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
1fb90 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
1fba0 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
1fbb0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
1fbc0 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
1fbd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1fbe0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1fbf0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
1fc00 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
1fc10 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
1fc20 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
1fc30 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
1fc40 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1fc50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
1fc60 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
1fc70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1fc80 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1fc90 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
1fca0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
1fcb0 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
1fcc0 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
1fcd0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
1fce0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
1fcf0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
1fd00 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
1fd10 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
1fd20 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
1fd30 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
1fd40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1fd50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1fd60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
1fd70 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1fd80 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
1fd90 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
1fda0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
1fdb0 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
1fdc0 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
1fdd0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
1fde0 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
1fdf0 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
1fe00 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
1fe10 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
1fe20 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1fe30 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1fe40 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1fe50 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
1fe60 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1fe70 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
1fe80 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
1fe90 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
1fea0 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
1feb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
1fec0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1fed0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
1fee0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
1fef0 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
1ff00 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
1ff10 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
1ff20 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
1ff30 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
1ff40 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
1ff50 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
1ff60 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
1ff70 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
1ff80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
1ff90 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
1ffa0 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
1ffb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ffc0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
1ffd0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1ffe0 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
1fff0 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
20000 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
20010 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
20020 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20030 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
20040 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
20050 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
20060 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
20070 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
20080 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
20090 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
200a0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
200b0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
200c0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
200d0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
200e0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
200f0 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
20100 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
20110 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
20120 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
20130 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
20140 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
20150 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
20160 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
20170 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
20180 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
20190 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
201a0 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
201b0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
201c0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
201d0 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
201e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
201f0 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
20200 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
20210 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20220 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
20230 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
20240 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
20250 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20260 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20270 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
20280 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
20290 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
202a0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
202b0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
202c0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
202d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
202e0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
202f0 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
20300 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
20310 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20320 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
20330 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
20340 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
20350 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
20360 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
20370 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
20380 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
20390 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
203a0 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
203b0 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
203c0 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
203d0 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
203e0 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
203f0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
20400 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
20410 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20420 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
20430 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
20440 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20450 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
20460 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
20470 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
20480 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
20490 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
204a0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
204b0 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
204c0 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
204d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
204e0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
204f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
20500 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
20510 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
20520 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
20530 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20540 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
20550 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
20560 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
20570 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
20580 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
20590 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
205a0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
205b0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
205c0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
205d0 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
205e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
205f0 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
20600 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
20610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
20620 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
20630 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
20640 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
20650 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
20660 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
20670 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
20680 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
20690 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
206a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
206b0 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
206c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
206d0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
206e0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
206f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
20700 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
20710 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20720 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
20730 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
20740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
20750 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
20760 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
20770 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
20780 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
20790 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
207a0 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
207b0 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
207c0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
207d0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
207e0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
207f0 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
20800 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
20810 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
20820 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
20830 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
20840 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
20850 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
20860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
20870 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
20880 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
20890 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
208a0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
208b0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
208c0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
208d0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
208e0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
208f0 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
20900 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
20910 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
20920 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
20930 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
20940 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
20950 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
20960 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
20970 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20980 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34 2b 70   offset==ii*(4+p
20990 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
209a0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
209b0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
209c0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
209d0 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
209e0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
209f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20a00 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
20a10 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
20a20 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
20a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20a40 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
20a50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
20a60 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
20a70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
20a80 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
20a90 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
20aa0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
20ab0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
20ac0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
20ad0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
20ae0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
20af0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
20b00 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
20b10 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
20b20 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
20b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
20b40 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
20b50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20b60 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
20b70 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
20b80 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
20b90 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
20ba0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
20bb0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
20bc0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
20bd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
20be0 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
20bf0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
20c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
20c10 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
20c20 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
20c30 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
20c40 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
20c50 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
20c60 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
20c70 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
20c80 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
20c90 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
20ca0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
20cb0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
20cc0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
20cd0 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
20ce0 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
20cf0 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
20d00 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
20d10 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
20d20 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
20d30 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
20d40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20d50 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
20d60 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
20d70 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
20d80 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
20d90 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
20da0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
20db0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
20dc0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
20de0 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
20df0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
20e00 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
20e10 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
20e20 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
20e30 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
20e40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20e50 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
20e60 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
20e70 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
20e80 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
20e90 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
20ea0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
20eb0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
20ec0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
20ed0 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
20ee0 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
20ef0 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
20f00 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
20f10 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
20f20 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
20f30 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
20f40 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
20f50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20f60 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
20f70 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
20f80 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
20f90 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
20fa0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
20fb0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
20fc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
20fd0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
20fe0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
20ff0 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
21000 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
21010 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
21020 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
21030 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
21040 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
21050 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
21060 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
21070 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
21080 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
21090 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
210a0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
210b0 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
210c0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
210d0 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
210e0 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
210f0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
21100 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
21110 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
21120 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
21130 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
21140 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
21150 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
21160 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
21170 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
21180 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
21190 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
211a0 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
211b0 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
211c0 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
211d0 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
211e0 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
211f0 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
21200 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
21210 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
21220 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
21230 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
21240 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
21250 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
21260 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
21270 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
21280 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
21290 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
212a0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
212b0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
212c0 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
212d0 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
212e0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
212f0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
21300 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21310 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
21320 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
21330 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
21340 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
21350 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
21360 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
21370 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
21380 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
21390 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
213a0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
213b0 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
213c0 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
213d0 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
213e0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
213f0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21400 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
21410 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
21420 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
21430 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
21440 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
21450 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
21460 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
21470 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
21480 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
21490 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
214a0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
214b0 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
214c0 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
214d0 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
214e0 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
214f0 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
21500 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
21510 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
21520 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
21530 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
21540 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
21550 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
21560 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
21570 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
21580 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
21590 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
215a0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
215b0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
215c0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
215d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
215e0 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
215f0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
21600 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
21610 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
21620 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21630 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
21640 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
21650 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
21660 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
21670 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
21680 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
21690 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
216a0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
216b0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
216c0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
216d0 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
216e0 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
216f0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21700 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21710 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21720 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21730 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21740 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
21750 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21760 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21770 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
21780 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21790 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
217a0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 7d 0a  C_NORMAL;.  }.}.
217b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
217c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
217d0 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
217e0 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
217f0 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
21800 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
21810 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
21820 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
21830 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
21840 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
21850 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
21860 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
21870 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
21880 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
21890 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
218a0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
218b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
218c0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
218d0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
218e0 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
218f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
21900 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
21910 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
21920 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
21930 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
21940 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
21950 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
21960 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
21970 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
21980 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
21990 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
219a0 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
219b0 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
219c0 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
219d0 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
219e0 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
219f0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
21a00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
21a10 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
21a20 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
21a30 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
21a40 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
21a50 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21a60 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
21a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
21a80 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
21a90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
21aa0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
21ab0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
21ac0 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
21ad0 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
21ae0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21af0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
21b00 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
21b10 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
21b20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
21b30 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
21b40 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
21b50 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
21b60 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
21b70 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
21b80 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
21b90 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
21ba0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
21bb0 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
21bc0 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
21bd0 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
21be0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
21bf0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
21c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
21c10 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
21c20 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
21c30 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
21c40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
21c50 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
21c60 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
21c70 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
21c80 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21c90 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
21ca0 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
21cb0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
21cc0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
21cd0 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
21ce0 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
21cf0 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
21d00 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
21d10 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
21d20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
21d30 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
21d40 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
21d50 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
21d60 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
21d70 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
21d80 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
21d90 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
21da0 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
21db0 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
21dc0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
21dd0 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
21de0 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
21df0 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
21e00 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
21e10 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
21e20 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
21e30 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
21e40 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
21e50 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
21e60 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
21e70 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
21ea0 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
21eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21ee0 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
21ef0 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
21f00 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
21f10 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
21f20 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
21f30 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
21f40 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
21f50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
21f60 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
21f70 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
21f80 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
21f90 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
21fa0 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
21fb0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
21fc0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
21fd0 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
21fe0 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
21ff0 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
22000 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
22010 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
22020 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
22030 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
22040 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
22050 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
22060 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
22070 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22090 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
220a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
220b0 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
220c0 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
220d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
220e0 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
220f0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
22100 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22120 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
22130 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
22140 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61  er */.){  .  pPa
22150 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
22160 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72  r = xBusyHandler
22170 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  ;.  pPager->pBus
22180 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42  yHandlerArg = pB
22190 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d  usyHandlerArg;.}
221a0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
221b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
221c0 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
221d0 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
221e0 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
221f0 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
22200 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
22210 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
22220 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
22230 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
22240 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
22250 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
22260 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
22270 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
22280 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
22290 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
222a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
222b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
222c0 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
222d0 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
222e0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
222f0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
22300 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
22310 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
22320 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
22330 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
22340 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
22350 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
22360 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
22370 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
22380 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
22390 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
223a0 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
223b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
223c0 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
223d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
223e0 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
223f0 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
22400 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
22410 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
22420 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
22430 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
22440 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
22450 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
22460 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
22470 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
22480 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
22490 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
224a0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
224b0 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
224c0 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
224d0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
224e0 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
224f0 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
22500 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
22510 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
22520 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
22530 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
22540 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
22550 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
22560 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
22570 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
22580 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
22590 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
225a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
225b0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
225c0 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
225d0 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
225e0 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
225f0 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
22600 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
22610 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
22620 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
22630 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
22640 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
22650 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
22660 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
22670 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
22680 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
22690 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
226a0 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
226b0 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
226c0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
226d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
226e0 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
226f0 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
22700 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
22710 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
22720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22730 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
22740 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
22750 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
22760 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
22770 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
22780 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
22790 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
227a0 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
227b0 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
227c0 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
227d0 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
227e0 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
227f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
22800 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
22810 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
22820 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
22830 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
22840 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
22850 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
22860 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
22870 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
22880 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
22890 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
228a0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
228b0 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
228c0 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
228d0 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
228e0 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
228f0 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
22900 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
22910 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
22920 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
22930 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
22940 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
22950 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
22960 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
22970 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
22980 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
22990 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
229a0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
229b0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
229c0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
229d0 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
229e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
229f0 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
22a00 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
22a10 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
22a20 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
22a30 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
22a40 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
22a50 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
22a60 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
22a70 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
22a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22a90 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
22aa0 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
22ab0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
22ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22ad0 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
22ae0 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
22af0 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
22b00 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
22b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22b20 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
22b30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22b40 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
22b50 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
22b60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
22b70 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28 6e 42 79  ize = (Pgno)(nBy
22b80 74 65 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  te/pageSize);.  
22b90 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
22ba0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
22bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
22bc0 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
22bd0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
22be0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
22bf0 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
22c00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
22c10 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
22c20 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
22c30 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ize);.    }.  }.
22c40 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
22c50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22c60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22c70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
22c80 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
22c90 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
22ca0 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
22cb0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
22cc0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
22cd0 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
22ce0 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
22cf0 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
22d00 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
22d10 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
22d20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22d30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
22d40 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
22d50 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
22d60 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
22d70 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
22d80 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
22d90 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
22da0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
22db0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
22dc0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
22dd0 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
22de0 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
22df0 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
22e00 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
22e10 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
22e20 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
22e30 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
22e40 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
22e50 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
22e60 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
22e70 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
22e80 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
22e90 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
22ea0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
22eb0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
22ec0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
22ed0 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
22ee0 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
22ef0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
22f00 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
22f10 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
22f20 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
22f30 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
22f40 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
22f50 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
22f60 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
22f70 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
22f80 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
22f90 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
22fa0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
22fb0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
22fc0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
22fd0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
22fe0 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
22ff0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
23000 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23010 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
23020 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
23030 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
23040 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
23050 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
23060 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
23070 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23080 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
23090 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61  EN );      /* Ca
230a0 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f  lled only by OP_
230b0 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73  MaxPgcnt */.  as
230c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
230d0 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
230e0 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d  Size );  /* OP_M
230f0 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73  axPgcnt enforces
23100 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72   this */.  retur
23110 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
23120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
23130 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
23140 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
23150 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
23160 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
23170 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
23180 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
23190 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
231a0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
231b0 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
231c0 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
231d0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
231e0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
231f0 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
23200 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
23210 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
23220 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
23230 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
23240 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
23250 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
23260 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
23270 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
23280 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
23290 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
232a0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
232b0 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
232c0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
232d0 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
232e0 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
232f0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
23300 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
23310 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
23320 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
23330 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
23340 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
23350 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
23360 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
23370 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
23380 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
23390 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
233a0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
233b0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
233c0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
233d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
233e0 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
233f0 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
23400 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
23410 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
23420 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
23430 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
23440 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
23450 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
23460 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
23470 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
23480 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
23490 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
234a0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
234b0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
234c0 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
234d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
234e0 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
234f0 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
23500 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
23510 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
23520 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
23530 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
23540 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
23550 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
23560 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
23570 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
23580 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
23590 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
235a0 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
235b0 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
235c0 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
235d0 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
235e0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
235f0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
23600 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
23610 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
23620 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
23630 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
23640 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
23650 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
23660 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23670 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
23680 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
23690 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
236a0 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
236b0 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
236c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
236d0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
236e0 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  empFile );..  /*
236f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23700 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
23710 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c  btree immediatel
23720 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67  y after creating
23730 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20  .  ** the Pager 
23740 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68  object.  There h
23750 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f  as not been an o
23760 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72  pportunity to tr
23770 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  ansition.  ** to
23780 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20   WAL mode yet.. 
23790 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
237a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
237b0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f  r) );..  if( isO
237c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
237d0 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
237e0 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
237f0 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
23800 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23810 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
23820 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
23830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23840 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
23850 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
23860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23870 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23880 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
23890 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
238a0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
238b0 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
238c0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
238d0 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49  .** the pager. I
238e0 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  t returns the to
238f0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
23900 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
23910 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  ase..**.** Howev
23920 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  er, if the file 
23930 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
23940 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74   <page-size> byt
23950 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e  es in size, then
23960 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e   .** this is con
23970 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65  sidered a 1 page
23980 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
23990 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
239a0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
239b0 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
239c0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
239d0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
239e0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
239f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
23a00 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
23a10 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20  ER_FINISHED );. 
23a20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29   *pnPage = (int)
23a30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
23a40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
23a50 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
23a60 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
23a70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23a80 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
23a90 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
23aa0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
23ab0 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
23ac0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
23ad0 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
23ae0 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
23af0 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
23b00 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
23b10 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
23b20 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
23b30 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
23b40 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
23b50 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
23b60 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
23b70 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
23b80 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
23b90 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
23ba0 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
23bb0 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
23bc0 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
23bd0 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
23be0 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
23bf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
23c00 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
23c10 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
23c20 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
23c30 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
23c40 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
23c50 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
23c60 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
23c70 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
23c80 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
23c90 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
23ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
23cb0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
23cc0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
23cd0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
23ce0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23d10 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ode */..  /* Che
23d20 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
23d30 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
23d40 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
23d50 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
23d60 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
23d70 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
23d80 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
23d90 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
23da0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
23db0 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
23dc0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
23dd0 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
23de0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
23df0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
23e00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
23e10 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d  (pPager->eLock>=
23e20 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
23e30 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
23e40 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c  ck==NO_LOCK && l
23e50 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
23e60 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK).       || 
23e70 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
23e80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
23e90 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
23ea0 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
23eb0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
23ec0 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
23ed0 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  ger, locktype);.
23ee0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
23ef0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
23f00 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
23f10 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
23f20 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
23f30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23f40 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
23f50 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
23f60 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
23f70 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
23f80 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
23f90 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
23fa0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
23fb0 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
23fc0 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
23fd0 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
23fe0 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
23ff0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
24000 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
24010 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
24020 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
24030 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
24040 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
24050 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
24060 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
24070 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
24080 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
24090 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
240a0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
240b0 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
240c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
240d0 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
240e0 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
240f0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
24100 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
24110 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
24120 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
24130 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
24140 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
24150 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
24160 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
24170 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
24180 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
24190 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
241a0 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
241b0 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
241c0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
241d0 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
241e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
241f0 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
24200 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
24210 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
24220 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
24230 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
24240 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c  t behaviour woul
24250 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
24260 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
24270 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
24280 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
24290 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
242a0 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
242b0 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
242c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
242d0 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
242e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
242f0 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
24300 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
24310 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
24320 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
24330 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
24340 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
24350 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
24360 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
24370 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
24380 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
24390 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
243a0 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
243b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
243c0 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
243d0 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
243e0 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
243f0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
24400 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
24410 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
24420 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
24430 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
24440 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
24450 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
24460 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
24470 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
24480 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
24490 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
244a0 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
244b0 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
244c0 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
244d0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
244e0 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
244f0 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
24500 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
24510 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
24520 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
24530 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
24540 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
24550 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
24560 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
24570 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
24580 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
24590 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
245a0 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
245b0 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
245c0 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
245d0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
245e0 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
245f0 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
24600 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
24610 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
24620 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
24630 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24640 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
24650 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
24660 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
24670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24680 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
24690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
246a0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
246b0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
246c0 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OD );.  pPager->
246d0 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
246e0 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65    assertTruncate
246f0 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
24700 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  r);.}.../*.** Th
24710 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
24720 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
24730 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
24740 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
24750 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
24760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
24770 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
24780 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
24790 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
247a0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
247b0 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
247c0 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
247d0 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
247e0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
247f0 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
24800 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
24810 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
24820 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
24830 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
24840 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
24850 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
24860 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
24870 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
24880 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
24890 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
248a0 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
248b0 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
248c0 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
248d0 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
248e0 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
248f0 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
24900 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
24910 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
24920 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
24930 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24940 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
24950 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
24960 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
24970 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
24980 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
24990 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
249a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
249b0 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
249c0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
249d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
249e0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
249f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
24a00 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
24a10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24a30 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
24a40 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
24a50 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
24a60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24a70 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
24a80 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
24a90 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
24aa0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
24ab0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
24ac0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
24ad0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
24ae0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
24af0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
24b00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
24b10 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
24b20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
24b30 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
24b40 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
24b50 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
24b60 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
24b70 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
24b80 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
24b90 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
24ba0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
24bb0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
24bc0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
24bd0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
24be0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
24bf0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
24c00 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
24c10 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
24c20 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
24c30 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
24c40 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
24c50 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
24c60 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
24c70 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
24c80 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
24c90 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
24ca0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
24cb0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
24cc0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
24cd0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
24ce0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
24cf0 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
24d00 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
24d10 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
24d20 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
24d30 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
24d40 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
24d50 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24d60 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
24d70 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
24d80 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
24d90 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
24da0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
24db0 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
24dc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24dd0 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61  _WAL.  sqlite3Wa
24de0 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
24df0 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70  Wal, pPager->ckp
24e00 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67  tSyncFlags, pPag
24e10 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54  er->pageSize, pT
24e20 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  mp);.  pPager->p
24e30 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Wal = 0;.#endif.
24e40 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
24e50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
24e60 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
24e70 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
24e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
24e90 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
24ea0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
24eb0 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
24ec0 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
24ed0 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
24ee0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
24ef0 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
24f00 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
24f10 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
24f20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
24f30 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
24f40 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
24f50 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
24f60 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
24f70 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
24f80 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
24f90 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
24fa0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
24fb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
24fc0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24fd0 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
24fe0 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
24ff0 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
25000 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
25010 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
25020 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
25030 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
25040 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
25050 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
25060 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
25070 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
25080 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
25090 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
250a0 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
250b0 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
250c0 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
250d0 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
250e0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
250f0 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
25100 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
25110 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
25120 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
25130 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
25140 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
25150 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
25160 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
25170 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
25180 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
25190 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
251a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
251b0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
251c0 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
251d0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
251e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
251f0 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
25200 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
25210 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
25220 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
25230 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
25240 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
25250 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
25260 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
25270 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
25280 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
25290 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
252a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
252b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
252c0 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
252d0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
252e0 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
252f0 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
25300 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
25310 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
25320 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
25330 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
25340 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
25350 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
25360 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
25370 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
25380 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
25390 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
253a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
253b0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
253c0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
253d0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
253e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
253f0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
25400 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
25410 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
25420 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
25430 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
25440 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
25450 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
25460 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
25470 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
25480 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
25490 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
254a0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
254b0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
254c0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
254d0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
254e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
254f0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
25500 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
25510 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
25520 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
25530 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
25540 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
25550 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
25560 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
25570 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
25580 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
25590 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
255a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
255b0 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
255c0 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
255d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
255e0 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
255f0 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
25600 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
25610 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
25620 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
25630 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
25640 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65  stics of the the
25650 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
25660 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
25670 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
25680 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
25690 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
256a0 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
256b0 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
256c0 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
256d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
256e0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
256f0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
25700 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
25710 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
25720 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
25730 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
25740 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
25750 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
25760 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
25770 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
25780 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
25790 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
257a0 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
257b0 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
257c0 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
257d0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
257e0 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
257f0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
25800 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
25810 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
25820 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
25830 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
25840 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
25850 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
25860 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
25870 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
25880 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
25890 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
258a0 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
258b0 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
258c0 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
258d0 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
258e0 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
258f0 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
25900 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
25910 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
25920 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
25930 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
25940 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
25950 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
25960 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
25970 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
25980 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
25990 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
259a0 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
259b0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
259c0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
259d0 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
259e0 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
259f0 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
25a00 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
25a10 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
25a20 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
25a30 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
25a40 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
25a50 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
25a60 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
25a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
25a80 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
25a90 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
25aa0 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ac0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
25ad0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
25ae0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25af0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
25b00 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
25b10 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
25b20 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
25b30 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
25b40 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
25b50 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
25b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
25b70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
25b80 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
25b90 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
25ba0 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
25bb0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25bc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
25bd0 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
25be0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
25bf0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
25c00 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
25c10 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
25c20 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
25c30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
25c40 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
25c50 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
25c60 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
25c70 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
25c80 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
25c90 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
25ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
25cb0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25cc0 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
25cd0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
25ce0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
25cf0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
25d00 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
25d10 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
25d20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
25d30 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
25d40 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
25d50 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
25d60 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
25d70 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
25d80 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
25d90 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
25da0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25db0 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
25dc0 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
25dd0 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
25de0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
25df0 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
25e00 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
25e10 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
25e20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
25e30 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
25e40 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
25e50 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
25e60 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
25e70 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
25e80 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
25e90 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
25ea0 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
25eb0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
25ec0 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
25ed0 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
25ee0 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
25ef0 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
25f00 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
25f10 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
25f20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
25f30 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
25f40 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
25f50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
25f60 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
25f70 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
25f80 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
25f90 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
25fa0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
25fb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
25fc0 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
25fd0 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
25fe0 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
25ff0 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
26000 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
26010 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
26020 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
26030 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
26040 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
26050 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
26060 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
26070 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
26080 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
26090 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
260a0 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
260b0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
260c0 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
260d0 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
260e0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
260f0 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
26100 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
26110 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
26120 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
26130 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
26140 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
26150 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26160 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
26170 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
26180 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
26190 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
261a0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
261b0 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
261c0 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
261d0 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
261e0 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
261f0 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
26200 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
26210 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
26220 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
26230 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
26240 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
26250 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
26260 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
26270 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
26280 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
26290 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
262a0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
262b0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
262c0 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
262d0 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
262e0 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
262f0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
26300 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
26310 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
26320 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
26330 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
26340 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
26350 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
26360 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
26370 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
26380 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
26390 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
263a0 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
263b0 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
263c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
263d0 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
263e0 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
263f0 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
26400 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
26410 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
26420 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
26430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26440 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
26450 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
26460 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
26470 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26480 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26490 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
264a0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
264b0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
264c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
264d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
264e0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
264f0 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
26500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
26510 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
26520 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
26530 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
26540 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
26550 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
26560 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
26570 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
26580 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
26590 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
265a0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
265b0 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
265c0 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
265d0 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
265e0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
265f0 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
26600 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
26610 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
26620 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
26630 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
26640 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
26650 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
26660 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
26670 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
26680 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
26690 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
266a0 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
266b0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
266c0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
266d0 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
266e0 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
266f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
26700 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
26710 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
26720 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
26730 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
26740 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
26750 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
26760 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
26770 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
26780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
26790 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
267a0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
267b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
267c0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
267d0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
267e0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
267f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26800 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
26810 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
26820 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
26830 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26840 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
26850 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
26860 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
26870 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
26880 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
26890 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
268a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
268b0 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
268c0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
268d0 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
268e0 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
268f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26900 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
26910 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26920 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
26930 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26940 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
26950 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
26960 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
26970 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
26980 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
26990 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
269a0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
269b0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
269c0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
269d0 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
269e0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
269f0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
26a00 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
26a10 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
26a20 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
26a30 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
26a40 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
26a50 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
26a60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26a70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26a80 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
26a90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
26aa0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
26ab0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
26ac0 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
26ad0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
26ae0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
26af0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
26b00 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
26b10 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
26b20 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
26b30 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
26b40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26b50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
26b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26b70 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
26b80 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
26b90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
26ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26bb0 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
26bc0 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
26bd0 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
26be0 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
26bf0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
26c00 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
26c10 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
26c20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
26c30 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
26c40 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
26c50 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
26c60 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
26c70 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
26c80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
26c90 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
26ca0 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
26cb0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
26cc0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
26cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
26cf0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
26d00 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
26d10 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
26d20 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
26d30 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
26d40 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
26d50 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
26d60 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
26d70 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
26d80 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
26d90 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
26da0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
26db0 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
26dc0 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
26dd0 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
26de0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
26df0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
26e00 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
26e10 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
26e20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
26e30 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
26e40 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
26e50 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
26e60 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
26e70 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
26e80 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
26e90 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
26ea0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
26eb0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
26ec0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
26ed0 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
26ee0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
26ef0 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
26f00 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
26f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26f20 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
26f30 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
26f40 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
26f50 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
26f60 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
26f70 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
26f80 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
26f90 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
26fa0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
26fb0 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
26fc0 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
26fd0 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
26fe0 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
26ff0 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
27000 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
27010 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
27020 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
27030 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
27040 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
27050 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
27060 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
27070 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
27080 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
27090 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
270a0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
270b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
270c0 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
270d0 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
270e0 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
270f0 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
27100 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
27110 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
27120 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
27130 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
27140 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
27150 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
27160 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
27170 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
27180 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
27190 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
271a0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
271b0 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
271c0 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
271d0 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
271e0 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
271f0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
27200 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
27210 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
27220 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
27230 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
27240 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
27250 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
27260 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
27270 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
27280 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
27290 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
272a0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
272b0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
272c0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
272d0 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
272e0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
272f0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
27300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27320 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
27330 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
27340 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
27350 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
27360 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
27370 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
27380 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
27390 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
273a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
273b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
273c0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
273d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
273e0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
273f0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
27400 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
27410 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
27420 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
27430 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
27440 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
27450 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
27460 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
27470 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
27480 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
27490 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
274a0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
274b0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
274c0 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
274d0 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
274e0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
274f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
27500 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
27510 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
27520 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
27530 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
27540 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
27550 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
27560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
27570 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74  e the first writ
27580 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20  e, give the VFS 
27590 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74  a hint of what t
275a0 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69  he final.  ** fi
275b0 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e  le size will be.
275c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
275d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
275e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
275f0 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  fd) );.  if( rc=
27600 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
27610 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61  ager->dbSize>pPa
27620 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
27630 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
27640 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
27650 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
27660 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
27670 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
27680 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
27690 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
276a0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
276b0 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a  L_SIZE_HINT, &sz
276c0 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65  File);.    pPage
276d0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
276e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
276f0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63    }..  while( rc
27700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
27710 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f  List ){.    Pgno
27720 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70   pgno = pList->p
27730 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  gno;..    /* If 
27740 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
27750 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
27760 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
27770 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
27780 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
27790 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
277a0 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
277b0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
277c0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
277d0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
277e0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
277f0 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
27800 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
27810 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
27820 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
27830 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
27840 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
27850 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  so, do not write
27860 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68   out any page th
27870 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52  at has the PGHDR
27880 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
27890 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74  .    ** set (set
278a0 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
278b0 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20  DontWrite())..  
278c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
278d0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
278e0 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e  e && 0==(pList->
278f0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54  flags&PGHDR_DONT
27900 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20  _WRITE) ){.     
27910 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70   i64 offset = (p
27920 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
27930 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20  er->pageSize;   
27940 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69  /* Offset to wri
27950 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  te */.      char
27960 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
27970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
27990 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20  ta to write */  
279a0 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74    ..      assert
279b0 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ( (pList->flags&
279c0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
279d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
279e0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
279f0 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
27a00 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
27a10 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  t);..      /* En
27a20 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73  code the databas
27a30 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43  e */.      CODEC
27a40 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
27a50 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c  >pData, pgno, 6,
27a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
27a70 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20  OMEM, pData);.. 
27a80 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75       /* Write ou
27a90 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  t the page data.
27aa0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
27ab0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
27ac0 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
27ad0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
27ae0 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20  e, offset);..   
27af0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20     /* If page 1 
27b00 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  was just written
27b10 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64  , update Pager.d
27b20 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74  bFileVers to mat
27b30 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ch.      ** the 
27b40 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64  value now stored
27b50 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27b60 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e   file. If writin
27b70 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a  g this .      **
27b80 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65   page caused the
27b90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
27ba0 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64  o grow, update d
27bb0 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20  bFileSize. .    
27bc0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
27bd0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
27be0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
27bf0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
27c00 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
27c10 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
27c20 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
27c30 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
27c40 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
27c50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
27c60 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
27c70 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a   pgno;.      }..
27c80 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
27c90 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63  any backup objec
27ca0 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63  ts copying the c
27cb0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20  ontents of this 
27cc0 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  pager. */.      
27cd0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
27ce0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
27cf0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
27d00 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a  pList->pData);..
27d10 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
27d20 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
27d30 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
27d40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
27d50 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
27d60 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
27d70 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
27d80 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  t)));.      IOTR
27d90 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
27da0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
27db0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
27dc0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
27dd0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
27de0 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  nt);.      PAGER
27df0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57  _INCR(pPager->nW
27e00 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rite);.    }else
27e10 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
27e20 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
27e30 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
27e40 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
27e50 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o));.    }.    p
27e60 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
27e70 68 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c  h(pList);.    pL
27e80 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
27e90 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
27ea0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27eb0 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  Ensure that the 
27ec0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
27ed0 20 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20   is open. If it 
27ee0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c  is already open,
27ef0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
27f00 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
27f10 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
27f20 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76  s returned if ev
27f30 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63  erything goes ac
27f40 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e  cording to plan.
27f50 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49   An .** SQLITE_I
27f60 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
27f70 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
27f80 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  if a call to sql
27f90 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a  ite3OsOpen() .**
27fa0 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
27fb0 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
27fc0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
27fd0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
27fe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
27ff0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
28000 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66  >sjfd) ){.    if
28010 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
28020 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
28030 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
28040 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  || pPager->subjI
28050 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20  nMemory ){.     
28060 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
28070 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
28080 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
28090 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
280a0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
280b0 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
280c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
280d0 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
280e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
280f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
28100 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20  a record of the 
28110 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
28120 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65   page pPg to the
28130 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a   sub-journal. .*
28140 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c  * It is the call
28150 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  ers responsibili
28160 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65  ty to use subjRe
28170 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20  quiresPage() to 
28180 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69  check .** that i
28190 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
281a0 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c  ired before call
281b0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
281c0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
281d0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
281e0 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
281f0 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69  g to pPg->pgno i
28200 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a  n the bitvecs.**
28210 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61   for all open sa
28220 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20  vepoints before 
28230 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
28240 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
28250 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
28260 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
28270 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  s successful, an
28280 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   IO.** error cod
28290 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  e if the attempt
282a0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
282b0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69   sub-journal fai
282c0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54  ls, or .** SQLIT
282d0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
282e0 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20  loc fails while 
282f0 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e  setting a bit in
28300 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20   a savepoint.** 
28310 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69  bitvec..*/.stati
28320 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
28330 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
28340 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
28350 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
28360 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
28370 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61  Pager;.  if( pPa
28380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
28390 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
283a0 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20  ODE_OFF ){..    
283b0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
283c0 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68  journal, if it h
283d0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
283e0 65 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  een opened */.  
283f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28400 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
28410 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
28420 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28430 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
28440 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73  Pager) );.    as
28450 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
28460 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50  ger->sjfd) || pP
28470 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30  ager->nSubRec==0
28480 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
28490 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
284a0 65 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  er) .         ||
284b0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
284c0 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
284d0 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
284e0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
284f0 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
28500 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
28510 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
28520 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
28530 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
28540 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
28550 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
28560 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
28570 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
28580 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
28590 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
285a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
285b0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
285c0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
285d0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
285e0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2a  pPager->nSubRec*
285f0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
28600 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ize);.      char
28610 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a 20 20 20   *pData2;.  .   
28620 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
28630 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
28640 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
28650 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
28660 61 32 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  a2);.      PAGER
28670 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
28680 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
28690 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
286a0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
286b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
286c0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
286d0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
286e0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
286f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
28710 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28720 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
28730 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
28740 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
28750 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
28760 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
28770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28780 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
28790 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
287a0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
287b0 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
287c0 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
287d0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
287e0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
287f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28800 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
28810 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
28820 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
28830 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
28840 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
28850 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
28860 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
28870 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
28880 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
28890 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
288a0 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
288b0 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
288c0 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
288d0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
288e0 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
288f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
28900 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
28910 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
28920 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
28930 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
28940 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
28950 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
28960 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
28970 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
28980 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
28990 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
289a0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
289b0 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
289c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
289d0 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
289e0 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
289f0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
28a00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
28a10 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
28a20 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
28a30 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
28a40 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
28a50 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
28a60 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
28a70 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
28a80 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
28a90 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
28aa0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
28ab0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
28ac0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
28ad0 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
28ae0 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
28af0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
28b00 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
28b10 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
28b20 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
28b30 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
28b40 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
28b50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
28b60 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
28b70 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
28b80 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
28b90 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
28ba0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
28bb0 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
28bc0 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
28bd0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
28be0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
28bf0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
28c00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
28c10 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
28c20 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
28c30 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
28c40 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
28c50 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
28c60 74 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20  tSyncSpill flag 
28c70 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 74 69  is set during ti
28c80 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61  mes when doing a
28c90 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f   sync of.  ** jo
28ca0 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64 69 6e  urnal (and addin
28cb0 67 20 61 20 6e 65 77 20 68 65 61 64 65 72 29 20  g a new header) 
28cc0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20  is not allowed. 
28cd0 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20 20 2a   This occurs.  *
28ce0 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73 20 74  * during calls t
28cf0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
28d00 69 74 65 28 29 20 77 68 69 6c 65 20 74 72 79 69  ite() while tryi
28d10 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75  ng to journal mu
28d20 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65  ltiple.  ** page
28d30 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
28d40 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a  he same sector..
28d50 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f    **.  ** The do
28d60 4e 6f 74 53 70 69 6c 6c 20 66 6c 61 67 20 69 6e  NotSpill flag in
28d70 68 69 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65  hibits all cache
28d80 20 73 70 69 6c 6c 69 6e 67 20 72 65 67 61 72 64   spilling regard
28d90 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 0a  less of whether.
28da0 20 20 2a 2a 20 6f 72 20 6e 6f 74 20 61 20 73 79    ** or not a sy
28db0 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
28dc0 20 54 68 69 73 20 69 73 20 73 65 74 20 64 75 72   This is set dur
28dd0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
28de0 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69    **.  ** Spilli
28df0 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69  ng is also prohi
28e00 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e  bited when in an
28e10 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e   error state sin
28e20 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20  ce that could.  
28e30 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  ** lead to datab
28e40 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ase corruption. 
28e50 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74    In the current
28e60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 6f 6e 20 69   implementaton i
28e70 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73  t .  ** is impos
28e80 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65  sible for sqlite
28e90 33 50 43 61 63 68 65 46 65 74 63 68 28 29 20 74  3PCacheFetch() t
28ea0 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  o be called with
28eb0 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 31 0a 20   createFlag==1. 
28ec0 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65   ** while in the
28ed0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65   error state, he
28ee0 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73  nce it is imposs
28ef0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
28f00 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65  utine to.  ** be
28f10 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65   called in the e
28f20 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76  rror state.  Nev
28f30 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e  ertheless, we in
28f40 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a  clude a NEVER().
28f50 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68    ** test for th
28f60 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73  e error state as
28f70 20 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61   a safeguard aga
28f80 69 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e  inst future chan
28f90 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ges..  */.  pPag
28fa0 65 72 2d 3e 68 61 73 53 65 65 6e 53 74 72 65 73  er->hasSeenStres
28fb0 73 20 3d 20 31 3b 0a 20 20 69 66 28 20 4e 45 56  s = 1;.  if( NEV
28fc0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
28fd0 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  de) ) return SQL
28fe0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
28ff0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
29000 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29010 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
29020 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
29030 6c 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  l && (pPg->flags
29040 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59   & PGHDR_NEED_SY
29050 4e 43 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  NC)!=0 ){.    re
29060 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29070 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72    }..  pPg->pDir
29080 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61  ty = 0;.  if( pa
29090 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
290a0 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74  ) ){.    /* Writ
290b0 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  e a single frame
290c0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74   for this page t
290d0 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20  o the log. */.  
290e0 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
290f0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a  esPage(pPg) ){ .
29100 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
29110 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20  urnalPage(pPg); 
29120 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
29130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29140 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
29150 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
29160 2c 20 70 50 67 2c 20 30 2c 20 30 2c 20 30 29 3b  , pPg, 0, 0, 0);
29170 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29180 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74    .    /* Sync t
29190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
291a0 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
291b0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
291c0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
291d0 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  NC .     || pPag
291e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
291f0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
29200 44 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  D.    ){.      r
29210 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
29220 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
29230 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
29240 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
29250 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6c  f this page is l
29260 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 63  arger than the c
29270 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 20  urrent size of. 
29280 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
29290 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
292a0 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
292b0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
292c0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 20 54  ournal..    ** T
292d0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
292e0 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  he call to pager
292f0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
29300 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  ) below will not
29310 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  .    ** actually
29320 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   write data to t
29330 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  he file in this 
29340 63 61 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  case..    **.   
29350 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   ** Consider the
29360 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65   following seque
29370 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20  nce of events:. 
29380 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 42     **.    **   B
29390 45 47 49 4e 3b 0a 20 20 20 20 2a 2a 20 20 20 20  EGIN;.    **    
293a0 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
293b0 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6d 6f  >.    **     <mo
293c0 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 20  dify page X>.   
293d0 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
293e0 54 20 73 70 3b 0a 20 20 20 20 2a 2a 20 20 20 20  T sp;.    **    
293f0 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62     <shrink datab
29400 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61  ase file to Y pa
29410 67 65 73 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20  ges>.    **     
29420 20 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61    pagerStress(pa
29430 67 65 20 58 29 0a 20 20 20 20 2a 2a 20 20 20 20  ge X).    **    
29440 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b   ROLLBACK TO sp;
29450 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
29460 66 20 28 58 3e 59 29 2c 20 74 68 65 6e 20 77 68  f (X>Y), then wh
29470 65 6e 20 70 61 67 65 72 53 74 72 65 73 73 20 69  en pagerStress i
29480 73 20 63 61 6c 6c 65 64 20 70 61 67 65 20 58 20  s called page X 
29490 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74  will not be writ
294a0 74 65 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  ten.    ** out t
294b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
294c0 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62 65  ile, but will be
294d0 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74 68   dropped from th
294e0 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a 20  e cache. Then,. 
294f0 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
29500 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
29510 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
29520 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
29530 69 6c 6c 20 72 65 61 64 0a 20 20 20 20 2a 2a 20  ill read.    ** 
29540 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
29550 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
29560 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  s will be the co
29570 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20  py of page X as 
29580 69 74 0a 20 20 20 20 2a 2a 20 77 61 73 20 77 68  it.    ** was wh
29590 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
295a0 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20  on started, not 
295b0 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22  as it was when "
295c0 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20  SAVEPOINT sp".  
295d0 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65    ** was execute
295e0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
295f0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
29600 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
29610 72 72 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70  rrent data for p
29620 61 67 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a  age X into the .
29630 20 20 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e      ** sub-journ
29640 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28 69 66 20  al file now (if 
29650 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
29660 79 20 74 68 65 72 65 29 2c 20 73 6f 20 74 68 61  y there), so tha
29670 74 20 69 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  t it will.    **
29680 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
29690 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75  its current valu
296a0 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  e when the "ROLL
296b0 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20 0a  BACK TO sp" is .
296c0 20 20 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e      ** executed.
296d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
296e0 4e 45 56 45 52 28 0a 20 20 20 20 20 20 20 20 72  NEVER(.        r
296f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29700 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
29710 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a  ->dbSize && subj
29720 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
29730 29 0a 20 20 20 20 29 20 29 7b 0a 20 20 20 20 20  ).    ) ){.     
29740 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
29750 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d  Page(pPg);.    }
29760 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
29770 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
29780 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
29790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
297a0 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
297b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
297c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
297d0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
297e0 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
297f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
29800 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
29810 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
29820 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
29830 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
29840 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
29850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29860 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
29870 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
29880 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29890 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
298a0 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
298b0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
298c0 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
298d0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
298e0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
298f0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
29900 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
29910 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
29920 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
29930 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
29940 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
29950 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
29960 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
29970 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
29980 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
29990 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
299a0 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
299b0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
299c0 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
299d0 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
299e0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
299f0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
29a00 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
29a10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
29a20 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
29a30 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
29a40 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
29a50 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
29a60 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
29a70 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
29a80 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
29a90 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
29aa0 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
29ab0 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
29ac0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
29ad0 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
29ae0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
29af0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
29b00 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
29b10 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
29b20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
29b30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
29b40 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
29b50 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
29b60 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
29b70 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
29b80 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
29b90 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
29ba0 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
29bb0 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
29bc0 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
29bd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
29be0 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
29bf0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
29c00 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
29c10 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
29c20 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
29c30 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
29c40 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
29c50 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
29c60 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
29c70 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
29c80 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
29c90 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
29ca0 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
29cb0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
29cc0 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
29cd0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
29ce0 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
29cf0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
29d00 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
29d10 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
29d20 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
29d30 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
29d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
29d50 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
29d60 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
29d70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
29d80 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
29d90 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
29da0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
29db0 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
29dc0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
29dd0 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
29de0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
29df0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
29e00 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
29e10 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
29e20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
29e30 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
29e40 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
29e50 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
29e60 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
29e70 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
29e80 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
29e90 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
29ea0 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
29eb0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
29ec0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
29ed0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
29ee0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
29ef0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
29f00 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
29f10 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
29f20 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
29f30 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
29f40 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
29f50 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
29f60 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
29f70 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
29f80 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
29f90 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
29fa0 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
29fb0 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
29fc0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
29fd0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
29fe0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
29ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a000 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2a010 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2a020 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2a030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2a040 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2a050 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2a060 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2a070 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2a080 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2a090 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2a0a0 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2a0b0 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2a0c0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2a0d0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2a0e0 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2a0f0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2a100 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a110 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2a120 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2a130 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2a140 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2a150 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2a160 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2a170 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2a180 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2a190 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2a1a0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2a1b0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2a1c0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2a1d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2a1e0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2a1f0 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2a200 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2a210 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2a220 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2a230 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2a240 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2a250 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2a260 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2a270 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2a280 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2a290 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2a2a0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2a2b0 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2a2c0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2a2d0 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2a2e0 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2a2f0 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2a300 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2a310 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
2a320 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
2a330 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
2a340 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
2a350 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
2a360 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
2a370 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
2a380 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
2a390 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
2a3a0 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
2a3b0 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44  */.  u32 szPageD
2a3c0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
2a3d0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2a3e0 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
2a3f0 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   size */.  const
2a400 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b   char *zUri = 0;
2a410 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20      /* URI args 
2a420 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
2a430 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20   nUri = 0;      
2a440 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a450 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20  of bytes of URI 
2a460 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f  args at *zUri */
2a470 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
2a480 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
2a490 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
2a4a0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
2a4b0 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
2a4c0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
2a4d0 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
2a4e0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
2a4f0 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
2a500 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
2a510 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
2a520 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
2a530 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
2a540 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
2a550 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
2a560 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2a570 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
2a580 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
2a590 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
2a5a0 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
2a5b0 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
2a5c0 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
2a5d0 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
2a5e0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
2a5f0 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
2a600 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
2a610 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2a620 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
2a630 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
2a640 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
2a650 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2a660 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
2a670 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2a680 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
2a690 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
2a6a0 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53  (sqlite3JournalS
2a6b0 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65  ize(pVfs));.  }e
2a6c0 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
2a6d0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2a6e0 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  8(sqlite3MemJour
2a6f0 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a  nalSize());.  }.
2a700 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
2a710 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
2a720 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
2a730 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
2a740 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
2a750 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
2a760 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
2a770 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41    if( flags & PA
2a780 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  GER_MEMORY ){.  
2a790 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
2a7a0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
2a7b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
2a7c0 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f   Compute and sto
2a7d0 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  re the full path
2a7e0 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63  name in an alloc
2a7f0 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e  ated buffer poin
2a800 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a  ted.  ** to by z
2a810 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68  Pathname, length
2a820 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20   nPathname. Or, 
2a830 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  if this is a tem
2a840 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a  porary file,.  *
2a850 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61  * leave both nPa
2a860 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68  thname and zPath
2a870 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20  name set to 0.. 
2a880 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2a890 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2a8a0 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  [0] ){.    const
2a8b0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50   char *z;.    nP
2a8c0 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
2a8d0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
2a8e0 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
2a8f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
2a900 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2a910 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2a920 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2a930 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2a940 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2a950 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2a960 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2a970 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2a980 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2a990 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2a9a0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2a9b0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2a9c0 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2a9d0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2a9e0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2a9f0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2aa00 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2aa10 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2aa20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2aa30 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2aa40 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2aa50 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2aa60 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2aa70 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2aa80 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2aa90 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2aaa0 3d 20 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 3b 0a  = &z[1] - zUri;.
2aab0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2aac0 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2aad0 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2aae0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2aaf0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2ab00 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2ab10 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2ab20 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2ab30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2ab40 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2ab50 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2ab60 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2ab70 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2ab80 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2ab90 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2aba0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2abb0 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2abc0 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2abd0 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2abe0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2abf0 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2ac00 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2ac10 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2ac20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2ac30 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2ac40 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2ac50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2ac60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ac70 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2ac80 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
2ac90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2aca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2acb0 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
2acc0 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
2acd0 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
2ace0 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
2acf0 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
2ad00 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
2ad10 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2ad20 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
2ad30 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
2ad40 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
2ad50 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
2ad60 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2ad70 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
2ad80 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2ad90 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
2ada0 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
2adb0 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
2adc0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2add0 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
2ade0 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
2adf0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2ae00 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
2ae10 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
2ae20 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
2ae30 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
2ae40 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2ae50 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
2ae60 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2ae70 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
2ae80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2ae90 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
2aea0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2aeb0 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2aec0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
2aed0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2aee0 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
2aef0 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
2af00 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2af10 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2af20 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
2af30 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
2af40 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2af50 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
2af60 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2af70 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
2af80 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2af90 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
2afa0 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
2afb0 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
2afc0 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
2afd0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
2afe0 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
2aff0 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
2b000 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2b010 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
2b020 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
2b030 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
2b040 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
2b050 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20   + nUri +       
2b060 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
2b070 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
2b080 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20  + 8 + 1         
2b090 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
2b0a0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2b0b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2b0c0 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20  + nPathname + 4 
2b0d0 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  + 1             
2b0e0 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2b0f0 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2b100 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2b110 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2b120 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2b130 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2b140 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2b150 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
2b160 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2b170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b180 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
2b190 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2b1a0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2b1b0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2b1c0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2b1d0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2b1e0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2b1f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2b200 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2b210 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2b220 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2b230 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2b240 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2b250 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2b260 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2b270 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2b280 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2b290 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2b2a0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2b2b0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b2c0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2b2d0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2b2e0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2b2f0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2b300 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2b310 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2b320 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2b330 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2b340 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2b350 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2b360 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2b370 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2b380 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2b390 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2b3a0 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2b3b0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2b3c0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2b3d0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2b3e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2b3f0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2b400 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2b410 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c  py(&pPager->zFil
2b420 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b  ename[nPathname+
2b430 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  1], zUri, nUri);
2b440 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2b450 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50  er->zJournal, zP
2b460 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2b470 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
2b480 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2b490 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2b4a0 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20  journal", 8);.  
2b4b0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2b4c0 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2b4d0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2b4e0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64  zJournal);.#ifnd
2b4f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2b500 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  AL.    pPager->z
2b510 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  Wal = &pPager->z
2b520 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2b530 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63  e+8+1];.    memc
2b540 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c  py(pPager->zWal,
2b550 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2b560 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2b570 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c  py(&pPager->zWal
2b580 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77  [nPathname], "-w
2b590 61 6c 22 2c 20 34 29 3b 0a 20 20 20 20 73 71 6c  al", 4);.    sql
2b5a0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2b5b0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2b5c0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29  e, pPager->zWal)
2b5d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2b5e0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
2b5f0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ame);.  }.  pPag
2b600 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
2b610 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
2b620 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
2b630 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70  .  /* Open the p
2b640 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  ager file..  */.
2b650 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2b660 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2b670 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20  ){.    int fout 
2b680 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2b690 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66          /* VFS f
2b6a0 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79  lags returned by
2b6b0 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20   xOpen() */.    
2b6c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2b6d0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2b6e0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67  >zFilename, pPag
2b6f0 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73  er->fd, vfsFlags
2b700 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73  , &fout);.    as
2b710 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a  sert( !memDb );.
2b720 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2b730 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2b740 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
2b750 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2b760 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2b770 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
2b780 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
2b790 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
2b7a0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2b7b0 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
2b7c0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
2b7d0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
2b7e0 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
2b7f0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
2b800 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
2b810 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
2b820 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2b830 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
2b840 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
2b850 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2b860 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
2b870 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
2b880 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
2b890 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
2b8a0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
2b8b0 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
2b8c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b8d0 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
2b8e0 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
2b8f0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2b900 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2b910 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2b920 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
2b930 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2b940 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
2b950 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
2b960 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
2b970 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2b980 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
2b990 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2b9a0 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
2b9b0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2b9c0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
2b9d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2b9e0 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
2b9f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
2ba00 61 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70  ageDflt = (u32)p
2ba10 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2ba20 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2ba30 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2ba40 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2ba50 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
2ba60 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
2ba70 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
2ba80 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
2ba90 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2baa0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
2bab0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
2bac0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
2bad0 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
2bae0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2baf0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2bb00 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
2bb10 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2bb20 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
2bb30 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
2bb40 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
2bb50 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
2bb60 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
2bb70 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2bb80 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
2bb90 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
2bba0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
2bbb0 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
2bbc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2bbd0 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
2bbe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bbf0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
2bc00 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
2bc10 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2bc20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2bc30 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2bc40 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2bc50 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2bc60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2bc70 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2bc80 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2bc90 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2bca0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2bcb0 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2bcc0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2bcd0 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2bce0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2bcf0 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2bd00 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2bd10 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2bd20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2bd30 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2bd40 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2bd50 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2bd60 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2bd70 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2bd80 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2bd90 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2bda0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
2bdb0 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
2bdc0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
2bdd0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45  te = PAGER_READE
2bde0 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  R;.    pPager->e
2bdf0 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2be00 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f  _LOCK;.    readO
2be10 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26  nly = (vfsFlags&
2be20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2be30 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ONLY);.  }..  /*
2be40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
2be50 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50  all to PagerSetP
2be60 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73  agesize() serves
2be70 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75   to set the valu
2be80 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72  e of .  ** Pager
2be90 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f  .pageSize and to
2bea0 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61   allocate the Pa
2beb0 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
2bec0 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ffer..  */.  if(
2bed0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bee0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2bef0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29  ager->memDb==0 )
2bf00 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2bf10 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
2bf20 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61  ze(pPager, &szPa
2bf30 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20  geDflt, -1);.   
2bf40 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
2bf50 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
2bf60 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
2bf70 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69  r occurred in ei
2bf80 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
2bf90 6b 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ks above, free t
2bfa0 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73  he .  ** Pager s
2bfb0 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
2bfc0 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  se the file..  *
2bfd0 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  /.  if( rc!=SQLI
2bfe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2bff0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54  ert( !pPager->pT
2c000 6d 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73  mpSpace );.    s
2c010 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
2c020 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
2c030 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
2c040 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
2c050 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  rc;.  }..  /* In
2c060 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
2c070 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
2c080 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
2c090 31 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61  1000 );.  nExtra
2c0a0 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2c0b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
2c0c0 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c  heOpen(szPageDfl
2c0d0 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44  t, nExtra, !memD
2c0e0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
2c0f0 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
2c100 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
2c110 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
2c120 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
2c130 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
2c140 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
2c150 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
2c160 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
2c170 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
2c180 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
2c190 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
2c1a0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2c1b0 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
2c1c0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
2c1d0 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
2c1e0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
2c1f0 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26   = (noReadlock &
2c200 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30  & readOnly) ?1:0
2c210 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2c220 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2c230 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2c240 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2c250 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2c260 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c270 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2c280 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2c290 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2c2a0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2c2b0 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2c2c0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2c2d0 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2c2e0 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
2c2f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2c300 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
2c310 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28  .#if 0.  assert(
2c320 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2c330 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
2c340 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
2c350 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
2c360 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61  .#endif.  /* pPa
2c370 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
2c380 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
2c390 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
2c3a0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
2c3b0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
2c3c0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
2c3d0 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
2c3e0 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
2c3f0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2c400 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
2c410 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
2c420 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2c430 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
2c440 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
2c450 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
2c460 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  .  pPager->chang
2c470 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
2c480 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
2c490 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
2c4a0 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
2c4b0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
2c4c0 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
2c4d0 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72   assert( useJour
2c4e0 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  nal || pPager->t
2c4f0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61  empFile );.  pPa
2c500 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
2c510 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
2c520 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
2c530 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
2c540 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
2c550 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
2c560 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
2c570 20 30 20 3a 20 53 51 4c 49 54 45 5f 53 59 4e 43   0 : SQLITE_SYNC
2c580 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70 50 61 67 65  _NORMAL;.  pPage
2c590 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
2c5a0 20 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46   = pPager->syncF
2c5b0 6c 61 67 73 3b 0a 20 20 2f 2a 20 70 50 61 67 65  lags;.  /* pPage
2c5c0 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
2c5d0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2c5e0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
2c5f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2c600 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
2c610 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
2c620 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
2c630 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c640 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
2c650 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
2c660 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
2c670 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2c680 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
2c690 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
2c6a0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2c6b0 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
2c6c0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
2c6d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2c6e0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2c6f0 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
2c700 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
2c710 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2c720 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2c730 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2c740 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
2c750 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
2c760 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c770 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
2c780 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
2c790 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
2c7a0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
2c7b0 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2c7c0 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2c7d0 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2c7e0 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65  ); */..  *ppPage
2c7f0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
2c800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c810 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
2c820 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2c830 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
2c840 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
2c850 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
2c860 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
2c870 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
2c880 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
2c890 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
2c8a0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
2c8b0 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
2c8c0 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
2c8d0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
2c8e0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
2c8f0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
2c900 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
2c910 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
2c920 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
2c930 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
2c940 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2c950 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
2c960 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
2c970 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
2c980 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
2c990 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
2c9a0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2c9b0 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2c9c0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
2c9d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
2c9e0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
2c9f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2ca00 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
2ca10 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
2ca20 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
2ca30 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
2ca40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ca50 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
2ca60 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
2ca70 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
2ca80 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2ca90 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
2caa0 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
2cab0 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
2cac0 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
2cad0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
2cae0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
2caf0 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
2cb00 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
2cb10 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
2cb20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cb30 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
2cb40 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
2cb50 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
2cb60 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2cb70 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2cb80 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
2cb90 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
2cba0 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
2cbb0 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
2cbc0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
2cbd0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
2cbe0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
2cbf0 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
2cc00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2cc10 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
2cc20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
2cc30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2cc40 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
2cc50 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
2cc60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
2cc70 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
2cc80 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
2cc90 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
2cca0 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
2ccb0 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
2ccc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2ccd0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
2cce0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
2ccf0 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
2cd00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
2cd10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2cd20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
2cd30 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
2cd40 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
2cd50 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2cd60 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
2cd70 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2cd80 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
2cd90 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
2cda0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2cdb0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2cdc0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2cdd0 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
2cde0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
2cdf0 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
2ce00 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2ce10 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
2ce20 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2ce30 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2ce40 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
2ce50 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
2ce60 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
2ce70 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
2ce80 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
2ce90 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
2cea0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
2ceb0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
2cec0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2ced0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  _OK;           /
2cee0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2cef0 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20  .  int exists = 
2cf00 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2cf10 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
2cf20 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
2cf30 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a  esent */.  int j
2cf40 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70  rnlOpen = !!isOp
2cf50 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  en(pPager->jfd);
2cf60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2cf70 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
2cf80 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2cf90 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2cfa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2cfb0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2cfc0 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73  R_OPEN );..  ass
2cfd0 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30  ert( jrnlOpen==0
2cfe0 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44   || ( sqlite3OsD
2cff0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2d000 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  tics(pPager->jfd
2d010 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49  ) &.    SQLITE_I
2d020 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
2d030 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b  _WHEN_OPEN.  ));
2d040 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ..  *pExists = 0
2d050 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65  ;.  if( !jrnlOpe
2d060 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
2d070 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
2d080 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2d090 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
2d0a0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
2d0b0 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  sts);.  }.  if( 
2d0c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2d0d0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
2d0e0 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20  nt locked = 0;  
2d0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2d100 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
2d110 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
2d120 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
2d130 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
2d140 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
2d150 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
2d160 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
2d170 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
2d180 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
2d190 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
2d1a0 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
2d1b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
2d1c0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
2d1d0 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
2d1e0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2d1f0 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
2d200 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
2d210 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
2d220 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
2d230 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
2d240 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
2d250 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
2d260 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
2d270 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
2d280 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
2d290 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
2d2a0 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
2d2b0 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
2d2c0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
2d2d0 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
2d2e0 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
2d2f0 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
2d300 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
2d310 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
2d320 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
2d330 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
2d340 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2d350 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
2d360 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
2d370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2d380 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
2d390 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
2d3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2d3b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2d3c0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2d3d0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65  */..      /* Che
2d3e0 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ck the size of t
2d3f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d400 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73  . If it consists
2d410 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20   of 0 pages,.   
2d420 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74     ** then delet
2d430 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2d440 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61 64  le. See the head
2d450 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  er comment above
2d460 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74   for .      ** t
2d470 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72  he reasoning her
2d480 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f  e.  Delete the o
2d490 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
2d4a0 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20  file under.     
2d4b0 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c   ** a RESERVED l
2d4c0 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63  ock to avoid rac
2d4d0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64  e conditions and
2d4e0 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74   to avoid violat
2d4f0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33  ing.      ** [H3
2d500 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a  3020]..      */.
2d510 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2d520 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2d530 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
2d540 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d550 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
2d560 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ( nPage==0 ){.  
2d570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
2d580 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
2d590 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ();.          if
2d5a0 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  ( pagerLockDb(pP
2d5b0 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
2d5c0 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  OCK)==SQLITE_OK 
2d5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2d5e0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
2d5f0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2d600 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
2d610 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2d620 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2d630 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  e ) pagerUnlockD
2d640 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
2d650 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2d660 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2d670 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
2d680 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2d690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d6a0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
2d6b0 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20  file exists and 
2d6c0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
2d6d0 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76  ion has a reserv
2d6e0 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
2d6f0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2d700 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2d710 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20  file. Now check 
2d720 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20  that there is.  
2d730 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65          ** at le
2d740 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f  ast one non-zero
2d750 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74   bytes at the st
2d760 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
2d770 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
2d780 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
2d790 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69  s, then we consi
2d7a0 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  der this journal
2d7b0 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e   to be hot. If n
2d7c0 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ot, .          *
2d7d0 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f  * it can be igno
2d7e0 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  red..          *
2d7f0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
2d800 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2d810 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
2d820 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2d830 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
2d840 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  N_MAIN_JOURNAL;.
2d850 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2d860 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2d870 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2d880 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2d890 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20  fd, f, &f);.    
2d8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d8b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d8c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2d8d0 20 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b     u8 first = 0;
2d8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2d8f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
2d900 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f  pPager->jfd, (vo
2d910 69 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20  id *)&first, 1, 
2d920 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2d930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
2d940 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
2d950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2d960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d970 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2d980 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2d990 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2d9a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d9b0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2d9c0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
2d9d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d9e0 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72   *pExists = (fir
2d9f0 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  st!=0);.        
2da00 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2da10 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
2da20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2da30 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  * If we cannot o
2da40 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  pen the rollback
2da50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
2da60 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66   order to see if
2da70 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2da80 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20 68  its has a zero h
2da90 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68  eader, that migh
2daa0 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49  t be due to an I
2dab0 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20  /O error, or.   
2dac0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d           ** it m
2dad0 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 74  ight be due to t
2dae0 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f  he race conditio
2daf0 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  n described abov
2db00 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20  e and in.       
2db10 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23       ** ticket #
2db20 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77 61  3883.  Either wa
2db30 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  y, assume that t
2db40 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
2db50 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  t..            *
2db60 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20  * This might be 
2db70 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65  a false positive
2db80 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73 2c  .  But if it is,
2db90 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20   then the.      
2dba0 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74        ** automat
2dbb0 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62  ic journal playb
2dbc0 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79  ack and recovery
2dbd0 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20   mechanism will 
2dbe0 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  deal.           
2dbf0 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65   ** with it unde
2dc00 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  r an EXCLUSIVE l
2dc10 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20  ock where we do 
2dc20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  not need to.    
2dc30 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79          ** worry
2dc40 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61   so much with ra
2dc50 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20  ce conditions.. 
2dc60 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20             */.  
2dc70 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69 73            *pExis
2dc80 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ts = 1;.        
2dc90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2dca0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2dcb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dcc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
2dcd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2dce0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2dcf0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
2dd00 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
2dd10 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2dd20 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69  se file..** It i
2dd30 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  s illegal to cal
2dd40 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  l sqlite3PagerAc
2dd50 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66  quire() until af
2dd60 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2dd70 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
2dd80 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
2dd90 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
2dda0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
2ddb0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
2ddc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ddd0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
2dde0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
2ddf0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
2de00 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
2de10 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
2de20 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
2de30 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
2de40 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
2de50 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
2de60 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
2de70 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
2de80 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
2de90 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
2dea0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
2deb0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
2dec0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2ded0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
2dee0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
2def0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
2df00 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
2df10 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2df20 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
2df30 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
2df40 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
2df50 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
2df60 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
2df70 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
2df80 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
2df90 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
2dfa0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
2dfb0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
2dfc0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
2dfd0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
2dfe0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
2dff0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e000 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
2e010 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
2e020 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
2e030 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
2e040 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
2e050 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2e060 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2e070 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
2e080 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
2e090 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
2e0a0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
2e0b0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
2e0c0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
2e0d0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
2e0e0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
2e0f0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
2e100 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2e110 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
2e120 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
2e130 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2e140 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
2e150 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
2e160 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
2e170 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
2e180 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
2e190 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
2e1a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
2e1b0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
2e1c0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
2e1d0 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
2e1e0 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
2e1f0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2e200 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
2e210 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
2e220 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
2e230 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2e240 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2e250 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
2e260 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
2e270 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2e280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2e2a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2e2b0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
2e2c0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
2e2d0 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
2e2e0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
2e2f0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
2e300 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
2e310 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
2e320 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
2e330 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
2e340 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
2e350 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
2e360 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
2e370 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
2e380 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
2e390 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
2e3a0 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
2e3b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
2e3c0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2e3d0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
2e3e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
2e3f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
2e400 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
2e410 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
2e420 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
2e430 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
2e440 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
2e450 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
2e460 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
2e470 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
2e480 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
2e490 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
2e4a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2e4b0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
2e4c0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
2e4d0 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
2e4e0 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
2e4f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2e500 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
2e510 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
2e520 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
2e530 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
2e540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52  ert( pPager->noR
2e550 65 61 64 6c 6f 63 6b 3d 3d 30 20 7c 7c 20 70 50  eadlock==0 || pP
2e560 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
2e570 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
2e580 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 3d 3d 30  r->noReadlock==0
2e590 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2e5a0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2e5b0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
2e5c0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
2e5d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e5e0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2e5f0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
2e600 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
2e610 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
2e620 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
2e630 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2e640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2e650 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
2e660 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
2e670 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
2e680 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
2e690 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
2e6a0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
2e6b0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
2e6c0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2e6d0 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
2e6e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
2e6f0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
2e700 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
2e710 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
2e720 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
2e730 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
2e740 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
2e750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e760 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2e770 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
2e780 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
2e790 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
2e7a0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
2e7b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2e7c0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
2e7d0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
2e7e0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
2e7f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
2e800 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
2e810 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
2e820 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
2e830 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
2e840 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
2e850 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
2e860 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
2e870 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
2e880 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2e890 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
2e8a0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
2e8b0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
2e8c0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
2e8d0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
2e8e0 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
2e8f0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
2e900 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
2e910 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
2e920 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
2e930 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
2e940 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
2e950 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
2e960 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
2e970 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
2e980 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
2e990 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
2e9a0 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
2e9b0 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
2e9c0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
2e9d0 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
2e9e0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
2e9f0 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
2ea00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2ea10 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ile..      **.  
2ea20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68      ** Unless th
2ea30 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f  e pager is in lo
2ea40 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
2ea50 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c  sive mode, the l
2ea60 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ock is.      ** 
2ea70 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48  downgraded to SH
2ea80 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65  ARED_LOCK before
2ea90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2eaa0 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f  eturns..      */
2eab0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2eac0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2ead0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2eae0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2eaf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eb00 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
2eb10 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
2eb20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74   /* If it is not
2eb30 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e   already open an
2eb40 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  d the file exist
2eb50 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20  s on disk, open 
2eb60 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  the .      ** jo
2eb70 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
2eb80 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69  rite access. Wri
2eb90 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71  te access is req
2eba0 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20  uired because . 
2ebb0 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75       ** in exclu
2ebc0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
2ebd0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
2ebe0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
2ebf0 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a  t open .      **
2ec00 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73   and possibly us
2ec10 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
2ec20 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41  tion later on. A
2ec30 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73  lso, write-acces
2ec40 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  s .      ** is u
2ec50 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20  sually required 
2ec60 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
2ec70 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e  journal in journ
2ec80 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20  al_mode=persist 
2ec90 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28  .      ** mode (
2eca0 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75  and also for jou
2ecb0 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61  rnal_mode=trunca
2ecc0 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  te on some syste
2ecd0 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ms)..      **.  
2ece0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f      ** If the jo
2ecf0 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
2ed00 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79  xist, it usually
2ed10 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
2ed20 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72   .      ** other
2ed30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61   connection mana
2ed40 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e  ged to get in an
2ed50 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62  d roll it back b
2ed60 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  efore .      ** 
2ed70 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
2ed80 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63  obtained the exc
2ed90 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76  lusive lock abov
2eda0 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20  e. Or, it .     
2edb0 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
2edc0 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
2edd0 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
2ede0 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
2edf0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77     ** function w
2ee00 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68  as called and th
2ee10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
2ee20 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
2ee30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
2ee40 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
2ee50 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2ee60 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
2ee70 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
2ee80 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20  ger->pVfs;.     
2ee90 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20     int bExists; 
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eeb0 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
2eec0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
2eed0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2eee0 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20  te3OsAccess(.   
2eef0 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70           pVfs, p
2ef00 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2ef10 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2ef20 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29  XISTS, &bExists)
2ef30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2ef40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
2ef50 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20  Exists ){.      
2ef60 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
2ef70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
2ef80 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
2ef90 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2efa0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2efb0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  AL;.          as
2efc0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
2efd0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
2efe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2eff0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2f000 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2f010 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20  pPager->jfd, f, 
2f020 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  &fout);.        
2f030 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2f040 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2f050 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2f060 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2f070 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2f080 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
2f090 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
2f0a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2f0b0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2f0c0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2f0d0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2f0e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2f0f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f100 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20    }.      }. .  
2f110 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
2f120 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
2f130 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
2f140 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
2f150 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
2f160 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
2f170 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
2f180 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
2f190 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
2f1a0 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
2f1b0 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
2f1c0 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
2f1d0 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
2f1e0 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
2f1f0 61 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20  ache.  Sync the 
2f200 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot journal befo
2f210 72 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20  re playing.     
2f220 20 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63   ** it back sinc
2f230 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  e the process th
2f240 61 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c  at crashed and l
2f250 65 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  eft the hot jour
2f260 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  nal.      ** pro
2f270 62 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79  bably did not sy
2f280 6e 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65  nc it and we are
2f290 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77   required to alw
2f2a0 61 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a  ays sync.      *
2f2b0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  * the journal be
2f2c0 66 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20  fore playing it 
2f2d0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  back..      */. 
2f2e0 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2f2f0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2f300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2f320 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
2f330 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
2f340 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
2f350 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f370 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2f380 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
2f390 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
2f3a0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
2f3b0 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20  ER_OPEN;.       
2f3c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2f3d0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
2f3e0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
2f3f0 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b       pagerUnlock
2f400 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2f410 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
2f420 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
2f430 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f440 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2f450 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20  nch is taken if 
2f460 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2f470 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2f480 6f 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  open.        ** 
2f490 6f 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68  or roll back a h
2f4a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65  ot-journal while
2f4b0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
2f4c0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
2f4d0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72          ** pager
2f4e0 5f 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  _unlock() routin
2f4f0 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  e will be called
2f500 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2f510 67 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20  g to unlock.    
2f520 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e      ** the file.
2f530 20 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61   If the unlock a
2f540 74 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68  ttempt fails, th
2f550 65 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d  en Pager.eLock m
2f560 75 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ust be.        *
2f570 2a 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  * set to UNKNOWN
2f580 5f 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63  _LOCK (see the c
2f590 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65  omment above the
2f5a0 20 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20   #define for .  
2f5b0 20 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e        ** UNKNOWN
2f5c0 5f 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20  _LOCK above for 
2f5d0 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e  an explanation).
2f5e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
2f5f0 20 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72       ** In order
2f600 20 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e   to get pager_un
2f610 6c 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69  lock() to do thi
2f620 73 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74  s, set Pager.eSt
2f630 61 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ate to.        *
2f640 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f  * PAGER_ERROR no
2f650 77 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  w. This is not a
2f660 63 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20  ctually counted 
2f670 61 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a  as a transition.
2f680 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52          ** to ER
2f690 52 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65  ROR state in the
2f6a0 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61   state diagram a
2f6b0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69  t the top of thi
2f6c0 73 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  s file,.        
2f6d0 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2f6e0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
2f6f0 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
2f700 6f 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a  ock() will very.
2f710 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
2f720 6c 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68  ly transition th
2f730 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74  e pager object t
2f740 6f 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65  o the OPEN state
2f750 2e 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20  . Calling.      
2f760 20 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65    ** assert_page
2f770 72 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20  r_state() would 
2f780 66 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20  fail now, as it 
2f790 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f  should not be po
2f7a0 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a  ssible.        *
2f7b0 2a 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52  * to be in ERROR
2f7c0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72   state when ther
2f7d0 65 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74  e are zero outst
2f7e0 61 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20  anding page .   
2f7f0 20 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63       ** referenc
2f800 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2f810 20 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72         pager_err
2f820 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2f830 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
2f840 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
2f850 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f860 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2f870 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20  R_OPEN );.      
2f880 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
2f890 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
2f8a0 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  OCK).           
2f8b0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c  || (pPager->excl
2f8c0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
2f8d0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45  ger->eLock>SHARE
2f8e0 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b  D_LOCK).      );
2f8f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2f900 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2f910 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  e .     && (pPag
2f920 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73  er->pBackup || s
2f930 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2f940 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
2f950 43 61 63 68 65 29 3e 30 29 20 0a 20 20 20 20 29  Cache)>0) .    )
2f960 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
2f970 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
2f980 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
2f990 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2f9a0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
2f9b0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
2f9c0 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
2f9d0 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
2f9e0 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
2f9f0 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
2fa00 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
2fa10 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2fa20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
2fa30 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
2fa40 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
2fa50 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
2fa60 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
2fa70 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
2fa80 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2fa90 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
2faa0 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
2fab0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
2fac0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
2fad0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
2fae0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
2faf0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
2fb00 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
2fb10 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
2fb20 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
2fb30 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
2fb40 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
2fb50 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
2fb60 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
2fb70 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
2fb80 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
2fb90 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
2fba0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
2fbb0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
2fbc0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
2fbd0 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
2fbe0 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
2fbf0 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
2fc00 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
2fc10 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
2fc20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
2fc30 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
2fc40 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
2fc50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
2fc60 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
2fc70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2fc80 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b   Pgno nPage = 0;
2fc90 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
2fca0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
2fcb0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2fcc0 29 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  )];..      rc = 
2fcd0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2fce0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
2fcf0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2fd00 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20  oto failed;..   
2fd10 20 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29     if( nPage>0 )
2fd20 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
2fd30 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
2fd40 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
2fd50 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
2fd60 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2fd70 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
2fd80 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
2fd90 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
2fda0 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
2fdb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2fdc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2fdd0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
2fde0 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
2fdf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fe00 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
2fe10 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
2fe20 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
2fe30 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2fe40 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
2fe50 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
2fe60 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
2fe70 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
2fe80 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
2fe90 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
2fea0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2feb0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2fec0 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74   a WAL file in t
2fed0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
2fee0 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62 61  open this databa
2fef0 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a  se in WAL.    **
2ff00 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   mode. Otherwise
2ff10 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
2ff20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73  function call is
2ff30 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f   a no-op..    */
2ff40 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f  .    rc = pagerO
2ff50 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28  penWalIfPresent(
2ff60 70 50 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66  pPager);.#ifndef
2ff70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2ff80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ff90 67 65 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20  ger->pWal==0 || 
2ffa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2ffb0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
2ffc0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
2ffd0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
2ffe0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2fff0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
30000 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
30010 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
30020 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  );.  }..  if( pP
30030 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30040 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d  GER_OPEN && rc==
30050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30060 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
30070 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50  ount(pPager, &pP
30080 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
30090 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
300a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
300b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
300c0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61  !MEMDB );.    pa
300d0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
300e0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
300f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30100 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
30110 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
30120 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
30130 52 5f 52 45 41 44 45 52 3b 0a 20 20 7d 0a 20 20  R_READER;.  }.  
30140 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
30150 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
30160 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
30170 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
30180 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
30190 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
301a0 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
301b0 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
301c0 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
301d0 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
301e0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
301f0 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
30200 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
30210 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
30220 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
30230 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
30240 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
30250 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
30260 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
30270 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
30280 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
30290 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
302a0 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
302b0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
302c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
302d0 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
302e0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
302f0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
30300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
30310 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
30320 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
30330 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
30340 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
30350 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
30360 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
30370 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
30380 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
30390 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
303a0 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
303b0 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
303c0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
303d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
303e0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
303f0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
30400 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
30410 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
30420 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
30430 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
30440 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
30450 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
30460 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
30470 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
30480 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
30490 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
304a0 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
304b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
304c0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
304d0 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
304e0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
304f0 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
30500 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
30510 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
30520 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
30530 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
30540 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
30550 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
30560 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
30570 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
30580 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
30590 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
305a0 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
305b0 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
305c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
305d0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
305e0 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
305f0 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
30600 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
30610 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
30620 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
30630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
30640 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
30650 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
30660 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
30670 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
30680 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
30690 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
306a0 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
306b0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
306c0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
306d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
306e0 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
306f0 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
30700 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
30710 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
30720 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
30730 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
30740 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
30750 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
30760 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
30770 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
30780 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
30790 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
307a0 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
307b0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
307c0 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65 20 73  n two seperate s
307d0 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
307e0 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e    a) When readin
307f0 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  g a free-list le
30800 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  af page from the
30810 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a   database, and.*
30820 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61  *.**   b) When a
30830 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65   savepoint is be
30840 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ing rolled back 
30850 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c  and we need to l
30860 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65  oad.**      a ne
30870 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
30880 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c  cache to be fill
30890 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
308a0 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
308b0 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  om the savepoint
308c0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
308d0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
308e0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
308f0 61 74 61 20 72 65 74 75 72 6e 65 64 20 69 73 20  ata returned is 
30900 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f  zeroed instead o
30910 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20  f.** being read 
30920 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
30930 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
30940 20 74 68 65 20 62 69 74 73 20 63 6f 72 72 65 73   the bits corres
30950 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67  ponding.** to pg
30960 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  no in Pager.pInJ
30970 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f  ournal (bitvec o
30980 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
30990 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a  written to the.*
309a0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  * journal file) 
309b0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
309c0 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
309d0 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66 20 61  int bitvecs of a
309e0 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70  ny open.** savep
309f0 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54  oints are set. T
30a00 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65  his means if the
30a10 20 70 61 67 65 20 69 73 20 6d 61 64 65 20 77 72   page is made wr
30a20 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a  itable at any.**
30a30 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
30a40 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61  ture, using a ca
30a50 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
30a60 65 72 57 72 69 74 65 28 29 2c 20 69 74 73 20 63  erWrite(), its c
30a70 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20  ontents.** will 
30a80 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64  not be journaled
30a90 2e 20 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e  . This saves IO.
30aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
30ab0 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
30ac0 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
30ad0 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
30ae0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
30af0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
30b00 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
30b10 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
30b20 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
30b30 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
30b40 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
30b50 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
30b60 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
30b70 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
30b80 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
30b90 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
30ba0 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
30bb0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
30bc0 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
30bd0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
30be0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
30bf0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
30c00 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
30c10 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
30c20 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
30c30 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
30c40 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
30c50 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
30c60 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
30c70 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
30c80 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
30c90 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
30ca0 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
30cb0 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
30cc0 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
30cd0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
30ce0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
30cf0 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20  l files..*/.int 
30d00 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
30d10 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
30d20 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
30d30 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
30d40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30d50 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
30d60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
30d70 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
30d80 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
30d90 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
30da0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
30db0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
30dc0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
30dd0 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
30de0 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
30df0 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
30e00 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
30e10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
30e20 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73  Hdr *pPg;..  ass
30e30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
30e40 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
30e50 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  R );.  assert( a
30e60 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
30e70 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  e(pPager) );..  
30e80 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  if( pgno==0 ){. 
30e90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30ea0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
30eb0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
30ec0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
30ed0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74  error state, ret
30ee0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d  urn an error imm
30ef0 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20  ediately. .  ** 
30f00 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71 75 65  Otherwise, reque
30f10 73 74 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  st the page from
30f20 20 74 68 65 20 50 43 61 63 68 65 20 6c 61 79 65   the PCache laye
30f30 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  r. */.  if( pPag
30f40 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
30f50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
30f60 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
30f70 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
30f80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
30f90 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
30fa0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
30fb0 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20 7d 0a  1, ppPage);.  }.
30fc0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
30fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  E_OK ){.    /* E
30fe0 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74  ither the call t
30ff0 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  o sqlite3PcacheF
31000 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20  etch() returned 
31010 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a  an error or the.
31020 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73      ** pager was
31030 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
31040 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
31050 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
31060 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
31070 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61  * Set pPg to 0 a
31080 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65  nd jump to the e
31090 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72  xception handler
310a0 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  .  */.    pPg = 
310b0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  0;.    goto page
310c0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
310d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
310e0 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
310f0 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
31100 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
31110 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28 2a 70  r==pPager || (*p
31120 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d  pPage)->pPager==
31130 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a 70 70  0 );..  if( (*pp
31140 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20 26 26  Page)->pPager &&
31150 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20   !noContent ){. 
31160 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
31170 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c  se the pcache al
31180 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61  ready contains a
31190 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f  n initialized co
311a0 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  py of.    ** the
311b0 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69   page. Return wi
311c0 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64  thout further ad
311d0 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  o.  */.    asser
311e0 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d  t( pgno<=PAGER_M
311f0 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21  AX_PGNO && pgno!
31200 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
31210 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 50 41  Pager) );.    PA
31220 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
31230 3e 6e 48 69 74 29 3b 0a 20 20 20 20 72 65 74 75  >nHit);.    retu
31240 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
31250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
31260 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
31270 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
31280 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
31290 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
312a0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
312b0 65 64 2e 20 20 2a 2f 0a 0a 20 20 20 20 50 41 47  ed.  */..    PAG
312c0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
312d0 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 20  nMiss);.    pPg 
312e0 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70  = *ppPage;.    p
312f0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
31300 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ger;..    /* The
31310 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
31320 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
31330 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
31340 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
31350 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
31360 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
31370 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63  r the unused loc
31380 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65  king-page, is re
31390 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20  quested. */.    
313a0 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
313b0 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
313c0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
313d0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
313e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
313f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
31400 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
31410 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  re_err;.    }.. 
31420 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20     if( MEMDB || 
31430 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
31440 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  gno || noContent
31450 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
31460 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
31470 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
31480 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
31490 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
314a0 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f  FULL;.        go
314b0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
314c0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
314d0 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e      if( noConten
314e0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
314f0 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74  Failure to set t
31500 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49  he bits in the I
31510 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63  nJournal bit-vec
31520 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a  tors is benign..
31530 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65          ** It me
31540 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20  rely means that 
31550 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65  we might do some
31560 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a   extra work to j
31570 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20  ournal a .      
31580 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64    ** page that d
31590 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
315a0 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e  be journaled.  N
315b0 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20  evertheless, be 
315c0 73 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  sure .        **
315d0 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
315e0 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63  e where a malloc
315f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
31600 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65  ile trying to se
31610 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  t .        ** a 
31620 62 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63  bit in a bit vec
31630 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  tor..        */.
31640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
31650 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
31660 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
31670 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
31680 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
31690 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20        TESTONLY( 
316a0 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69  rc = ) sqlite3Bi
316b0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
316c0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
316d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
316e0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
316f0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
31700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53     }.        TES
31710 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
31720 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
31730 65 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ecs(pPager, pgno
31740 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
31750 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
31760 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
31770 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
31780 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31790 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
317a0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
317b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
317c0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
317d0 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
317e0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
317f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31800 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
31810 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
31820 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
31830 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
31840 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31860 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
31870 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
31880 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
31890 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
318a0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
318b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
318c0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
318d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
318e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
318f0 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
31900 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
31910 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
31920 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
31930 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
31940 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
31950 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
31960 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
31970 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
31980 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
31990 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
319a0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
319b0 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
319c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
319d0 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
319e0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
319f0 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
31a00 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
31a10 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
31a20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
31a30 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
31a40 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
31a50 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
31a60 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
31a70 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
31a80 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
31a90 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
31aa0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
31ab0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
31ac0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
31ad0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
31ae0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
31af0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
31b00 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
31b10 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
31b20 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
31b30 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
31b40 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
31b50 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
31b60 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
31b70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31b80 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
31b90 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
31ba0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
31bb0 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61  PCache!=0 );.  a
31bc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
31bd0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
31be0 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
31bf0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
31c00 4f 52 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  OR );.  sqlite3P
31c10 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
31c20 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
31c30 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65  , 0, &pPg);.  re
31c40 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
31c50 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
31c60 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
31c70 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
31c80 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
31c90 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
31ca0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
31cb0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
31cc0 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
31cd0 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
31ce0 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
31cf0 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
31d00 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
31d10 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
31d20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
31d30 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
31d40 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
31d50 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
31d60 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
31d70 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
31d80 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
31d90 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
31da0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
31db0 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
31dc0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
31dd0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  d(pPager);.  }.}
31de0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
31df0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
31e00 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
31e10 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e  every write tran
31e20 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72  saction..** Ther
31e30 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62  e must already b
31e40 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
31e50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
31e60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
31e70 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  ** file when thi
31e80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
31e90 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20  led..**.** Open 
31ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31eb0 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
31ec0 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f  r and write a jo
31ed0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
31ee0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
31ef0 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  it. If there are
31f00 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
31f10 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62  ts, open the sub
31f20 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77  -journal.** as w
31f30 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ell. This functi
31f40 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
31f50 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
31f60 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a   file is being .
31f70 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69  ** opened to wri
31f80 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f  te a rollback lo
31f90 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  g for a transact
31fa0 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75  ion. It is not u
31fb0 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65  sed .** when ope
31fc0 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ning a hot journ
31fd0 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20  al file to roll 
31fe0 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
31ff0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
32000 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  le is already op
32010 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  en (as it may be
32020 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
32030 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  de),.** then thi
32040 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20  s function just 
32050 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c  writes a journal
32060 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73   header to the s
32070 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61  tart of the.** a
32080 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65  lready open file
32090 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72  . .**.** Whether
320a0 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
320b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
320c0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
320d0 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65  ion, the.** Page
320e0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.pInJournal bit
320f0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73  vec structure is
32100 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a   allocated..**.*
32110 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
32120 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
32130 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20   is successful. 
32140 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
32150 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  n .** SQLITE_NOM
32160 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  EM if the attemp
32170 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61  t to allocate Pa
32180 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66  ger.pInJournal f
32190 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20  ails, or .** an 
321a0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
321b0 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74   opening or writ
321c0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
321d0 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  file fails..*/.s
321e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
321f0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
32200 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
32210 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
32220 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
32230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
32240 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
32250 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
32260 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
32270 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61  >pVfs;   /* Loca
32280 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70  l cache of vfs p
32290 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ointer */..  ass
322a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
322b0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
322c0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73  R_LOCKED );.  as
322d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
322e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
322f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
32300 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
32310 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
32320 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
32330 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
32340 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
32350 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a   no-op.  But on.
32360 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68    ** the other h
32370 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  and, this routin
32380 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  e is never calle
32390 64 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65  d if we are alre
323a0 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  ady in.  ** an e
323b0 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
323c0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
323d0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
323e0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
323f0 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61  Code;..  if( !pa
32400 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
32410 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
32420 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
32430 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
32440 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
32450 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
32460 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
32470 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
32480 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
32490 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
324a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
324b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
324c0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65   }.  .    /* Ope
324d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
324e0 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  le if it is not 
324f0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f  already open. */
32500 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e  .    if( !isOpen
32510 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
32520 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
32530 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
32540 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32550 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
32560 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
32570 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
32580 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65  ->jfd);.      }e
32590 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  lse{.        con
325a0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20  st int flags =  
325b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325c0 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f   /* VFS flags to
325d0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
325e0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
325f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
32600 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
32610 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
32620 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
32630 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
32640 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
32650 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
32660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
32670 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20  _JOURNAL):.     
32680 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
32690 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
326a0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
326b0 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45   #ifdef SQLITE_E
326c0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
326d0 54 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  TE.        rc = 
326e0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
326f0 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  en(.            
32700 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32710 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32720 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c  jfd, flags, jrnl
32730 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
32740 72 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  r).        );.  
32750 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63  #else.        rc
32760 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
32770 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
32780 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
32790 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
327a0 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20  .  #endif.      
327b0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
327c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
327d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
327e0 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  jfd) );.    }.  
327f0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
32800 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
32810 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
32820 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
32830 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d open .    ** t
32840 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
32850 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  f necessary..   
32860 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
32870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32880 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
32890 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73  k if all of thes
328a0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71  e are really req
328b0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
328c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
328d0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
328e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
328f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
32900 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
32910 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
32920 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  alHdr = 0;.     
32930 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
32940 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
32950 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
32960 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32970 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
32980 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
32990 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
329a0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
329b0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c  urnal = 0;.  }el
329c0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
329d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
329e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
329f0 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65  KED );.    pPage
32a00 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
32a10 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
32a20 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
32a30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
32a40 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  gin a write-tran
32a50 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73  saction on the s
32a60 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f  pecified pager o
32a70 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20  bject. If a .** 
32a80 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
32a90 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
32aa0 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20  en opened, this 
32ab0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
32ac0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  -op..**.** If th
32ad0 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e  e exFlag argumen
32ae0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  t is false, then
32af0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
32b00 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  t a RESERVED.** 
32b10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32b20 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78  base file. If ex
32b30 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  Flag is true, th
32b40 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
32b50 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53  ast.** an EXCLUS
32b60 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63  IVE lock. If suc
32b70 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  h a lock is alre
32b80 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63  ady held, no loc
32b90 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  king .** functio
32ba0 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65  ns need be calle
32bb0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
32bc0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67  subjInMemory arg
32bd0 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  ument is non-zer
32be0 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d  o, then any sub-
32bf0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a  journal opened.*
32c00 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  * within this tr
32c10 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
32c20 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69  e opened as an i
32c30 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54  n-memory file. T
32c40 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66  his.** has no ef
32c50 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d  fect if the sub-
32c60 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61  journal is alrea
32c70 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74  dy opened (as it
32c80 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20   may be when.** 
32c90 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
32ca0 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66  sive mode) or if
32cb0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32cc0 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
32cd0 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  e a.** sub-journ
32ce0 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49  al. If the subjI
32cf0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
32d00 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61   is zero, then a
32d10 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73  ny required.** s
32d20 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d  ub-journal is im
32d30 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d  plemented in-mem
32d40 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73  ory if pPager is
32d50 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
32d60 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75  tabase, .** or u
32d70 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79  sing a temporary
32d80 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e   file otherwise.
32d90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
32da0 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20  agerBegin(Pager 
32db0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46  *pPager, int exF
32dc0 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d  lag, int subjInM
32dd0 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63  emory){.  int rc
32de0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
32df0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
32e00 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50  Code ) return pP
32e10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
32e20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32e30 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
32e40 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d  EADER && pPager-
32e50 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52  >eState<PAGER_ER
32e60 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ROR );.  pPager-
32e70 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20  >subjInMemory = 
32e80 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  (u8)subjInMemory
32e90 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
32ea0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
32eb0 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b  PAGER_READER) ){
32ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
32ed0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
32ee0 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  =0 );..    if( p
32ef0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32f00 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
32f10 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
32f20 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65  onfigured to use
32f30 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
32f40 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a  clusive, and an.
32f50 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
32f60 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ve lock on the d
32f70 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
32f80 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74  lready held, obt
32f90 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ain it now..    
32fa0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
32fb0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
32fc0 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57  Mode && sqlite3W
32fd0 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
32fe0 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31  pPager->pWal, -1
32ff0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
33000 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
33010 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
33020 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
33030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
33050 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
33060 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
33070 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f  e3WalExclusiveMo
33080 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  de(pPager->pWal,
33090 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   1);.      }..  
330a0 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20      /* Grab the 
330b0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
330c0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73  e log file. If s
330d0 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61  uccessful, upgra
330e0 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50  de to.      ** P
330f0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
33100 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
33110 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
33120 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
33130 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  er..      ** The
33140 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73   busy-handler is
33150 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20   not invoked if 
33160 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
33170 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20  on already.     
33180 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72   ** holds the wr
33190 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73  ite-lock. If pos
331a0 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72  sible, the upper
331b0 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c   layer will call
331c0 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
331d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
331e0 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
331f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
33200 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  >pWal);.    }els
33210 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61  e{.      /* Obta
33220 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
33230 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
33240 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
33250 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
33260 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75  .      ** is tru
33270 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74  e, then immediat
33280 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73  ely upgrade this
33290 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
332a0 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20   lock. The.     
332b0 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   ** busy-handler
332c0 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65   callback can be
332d0 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61   used when upgra
332e0 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c  ding to the EXCL
332f0 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c  USIVE.      ** l
33300 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65  ock, but not whe
33310 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20  n obtaining the 
33320 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20  RESERVED lock.. 
33330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
33340 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
33350 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
33360 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
33370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
33380 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  & exFlag ){.    
33390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
333a0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
333b0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
333c0 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
333d0 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
333e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
333f0 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20     /* Change to 
33400 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
33410 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
33420 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20      ** WAL mode 
33430 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74  sets Pager.eStat
33440 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45  e to PAGER_WRITE
33450 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48  R_LOCKED or CACH
33460 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68  EMOD.      ** wh
33470 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65  en it has an ope
33480 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62  n transaction, b
33490 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f  ut never to DBMO
334a0 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20  D or FINISHED.. 
334b0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
334c0 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65  because in those
334d0 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65   states the code
334e0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61   to roll back sa
334f0 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a  vepoint .      *
33500 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d  * transactions m
33510 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f  ay copy data fro
33520 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
33530 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  l into the datab
33540 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  ase .      ** fi
33550 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e  le as well as in
33560 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
33570 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62  e. Which would b
33580 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a  e incorrect in .
33590 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64        ** WAL mod
335a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
335b0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
335c0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
335d0 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50  LOCKED;.      pP
335e0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
335f0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
33600 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
33610 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50  >dbFileSize = pP
33620 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
33630 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
33640 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
33650 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
33660 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
33670 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  f = 0;.    }..  
33680 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
33690 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
336a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
336b0 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61  _READER );.    a
336c0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
336d0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
336e0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
336f0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20  ITER_LOCKED );. 
33700 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
33710 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33720 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ager) );.  }..  
33730 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
33740 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
33750 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
33760 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
33770 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
33780 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65  single data page
33790 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54   as writeable. T
337a0 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
337b0 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20  en into the .** 
337c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  main journal or 
337d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72  sub-journal as r
337e0 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20  equired. If the 
337f0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
33800 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  into.** one of t
33810 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  he journals, the
33820 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
33830 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65  it is set in the
33840 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f   .** Pager.pInJo
33850 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64  urnal bitvec and
33860 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
33870 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
33880 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61   bitvecs.** of a
33890 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ny open savepoin
338a0 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ts as appropriat
338b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
338c0 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
338d0 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
338e0 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
338f0 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
33900 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
33910 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
33920 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
33930 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
33940 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65   not called unle
33950 73 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ss a write-trans
33960 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
33970 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74  dy .  ** been st
33980 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e  arted. The journ
33990 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
339a0 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61  ay not be open a
339b0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
339c0 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63  ** It is never c
339d0 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52  alled in the ERR
339e0 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  OR state..  */. 
339f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
33a00 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
33a10 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20  RITER_LOCKED.   
33a20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
33a30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33a40 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
33a50 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
33a60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
33a70 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
33a80 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
33a90 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
33aa0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  er) );..  /* If 
33ab0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  an error has bee
33ac0 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74  n previously det
33ad0 65 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68  ected, report th
33ae0 65 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a  e same error.  *
33af0 2a 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68  * again. This sh
33b00 6f 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c  ould not happen,
33b10 20 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70   but the check p
33b20 72 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65  rovides robustne
33b30 73 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ss. */.  if( NEV
33b40 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
33b50 64 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50  de) )  return pP
33b60 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
33b70 20 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65    /* Higher-leve
33b80 6c 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72  l routines never
33b90 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
33ba0 69 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20  ion if database 
33bb0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74  is not.  ** writ
33bc0 61 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b  able.  But check
33bd0 20 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f   anyway, just fo
33be0 72 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  r robustness. */
33bf0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
33c00 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  ger->readOnly) )
33c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
33c20 45 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  ERM;..  CHECK_PA
33c30 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54  GE(pPg);..  /* T
33c40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
33c50 6e 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e  needs to be open
33c60 65 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c  ed. Higher level
33c70 20 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61   routines have a
33c80 6c 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61  lready.  ** obta
33c90 69 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61  ined the necessa
33ca0 72 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69  ry locks to begi
33cb0 6e 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  n the write-tran
33cc0 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65  saction, but the
33cd0 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  .  ** rollback j
33ce0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
33cf0 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70   yet be open. Op
33d00 65 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69  en it now if thi
33d10 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20  s is the case.. 
33d20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73   **.  ** This is
33d30 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c   done before cal
33d40 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
33d50 68 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e  heMakeDirty() on
33d60 20 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a   the page. .  **
33d70 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69   Otherwise, if i
33d80 74 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65  t were done afte
33d90 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
33da0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
33db0 28 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e  (), then.  ** an
33dc0 20 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63   error might occ
33dd0 75 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  ur and the pager
33de0 20 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e   would end up in
33df0 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
33e00 74 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70  tate.  ** with p
33e10 61 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64  ages marked as d
33e20 69 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68  irty in the cach
33e30 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
33e40 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33e50 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
33e60 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  D ){.    rc = pa
33e70 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
33e80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
33e90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33ea0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
33eb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
33ec0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
33ed0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
33ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
33ef0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
33f00 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f  (pPager) );..  /
33f10 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
33f20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68  as dirty.  If th
33f30 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61  e page has alrea
33f40 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a  dy been written.
33f50 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72    ** to the jour
33f60 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20  nal then we can 
33f70 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
33f80 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
33f90 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
33fa0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67  (pPg);.  if( pag
33fb0 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20  eInJournal(pPg) 
33fc0 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73  && !subjRequires
33fd0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
33fe0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
33ff0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
34000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20  .  }else{.  .   
34010 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
34020 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
34030 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
34040 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
34050 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
34060 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
34070 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
34080 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
34090 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
340a0 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
340b0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
340c0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
340d0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
340e0 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
340f0 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
34100 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
34110 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
34120 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
34130 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
34140 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
34150 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
34160 4f 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70  OrigSize && isOp
34170 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
34180 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
34190 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
341a0 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20  ar *pData2;.    
341b0 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70      i64 iOff = p
341c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
341d0 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  f;..        /* W
341e0 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
341f0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
34200 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
34210 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
34220 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
34230 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
34240 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
34250 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
34260 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
34270 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
34280 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
34290 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
342a0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
342b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
342c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
342d0 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Hdr<=pPager->jou
342e0 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20  rnalOff );.     
342f0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
34300 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
34310 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
34320 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
34330 61 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73  a2);.        cks
34340 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
34350 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
34360 61 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20  ata2);..        
34370 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f  /* Even if an IO
34380 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72   or diskfull err
34390 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
343a0 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
343b0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
343c0 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
343d0 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
343e0 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
343f0 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
34400 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
34410 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
34420 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
34430 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
34440 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
34450 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
34460 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
34470 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
34480 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
34490 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
344a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
344b0 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
344c0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
344d0 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
344e0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
344f0 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
34500 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
34510 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
34520 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
34530 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
34540 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
34550 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70  er->jfd, iOff, p
34560 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
34570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34580 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
34590 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
345a0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
345b0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
345c0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
345d0 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20  ize, iOff+4);.  
345e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
345f0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
34600 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20   rc;.        rc 
34610 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
34620 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b  ager->jfd, iOff+
34630 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
34640 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  +4, cksum);.    
34650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34660 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
34670 63 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52  c;..        IOTR
34680 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64  ACE(("JOUT %p %d
34690 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
346a0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
346b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
346c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
346d0 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  lOff, pPager->pa
346e0 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20  geSize));.      
346f0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
34700 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
34710 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
34720 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a    PAGERTRACE(("J
34730 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
34740 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
34750 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
34760 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
34770 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
34780 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
34790 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73      ((pPg->flags
347a0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
347b0 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61  )?1:0), pager_pa
347c0 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a  gehash(pPg)));..
347d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
347e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20  journalOff += 8 
347f0 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
34800 7a 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  ze;.        pPag
34810 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
34820 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34830 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
34840 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
34850 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
34860 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
34870 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
34880 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
34890 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
348a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
348b0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
348c0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
348d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
348e0 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54        rc |= addT
348f0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
34900 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
34910 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
34920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
34940 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34950 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
34960 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
34980 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
34990 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
349a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
349b0 4d 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MOD ){.         
349c0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
349d0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
349e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
349f0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41    PAGERTRACE(("A
34a00 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
34a10 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
34a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34a30 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
34a40 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
34a50 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
34a60 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
34a70 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29  EED_SYNC)?1:0)))
34a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
34a90 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
34aa0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
34ab0 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
34ac0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
34ad0 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
34ae0 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
34af0 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
34b00 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
34b10 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
34b20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
34b30 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
34b40 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
34b50 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
34b60 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
34b70 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
34b80 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
34b90 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
34ba0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34bb0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
34bc0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72  (pPg) ){.      r
34bd0 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
34be0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
34bf0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
34c00 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
34c10 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
34c20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
34c30 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
34c40 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
34c50 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
34c60 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
34c70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
34c80 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
34c90 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
34ca0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
34cb0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
34cc0 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e   .** making chan
34cd0 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54  ges to a page. T
34ce0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
34cf0 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
34d00 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69  value .** of thi
34d10 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62  s function and b
34d20 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
34d30 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
34d40 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a   data unless .**
34d50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
34d60 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
34d70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
34d80 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
34d90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
34da0 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
34db0 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
34dc0 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
34dd0 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
34de0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
34df0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
34e00 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
34e10 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
34e20 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
34e30 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
34e40 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
34e50 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
34e60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
34e70 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
34e80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
34e90 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
34ea0 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
34eb0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
34ec0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70  eturned.** as ap
34ed0 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72  propriate. Other
34ee0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
34ef0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
34f00 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
34f10 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
34f20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34f30 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
34f40 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
34f50 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
34f60 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
34f70 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
34f80 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
34f90 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
34fa0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65  geSize);..  asse
34fb0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
34fc0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
34fd0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
34fe0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
34ff0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
35000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
35010 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
35020 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
35030 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
35040 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
35050 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
35060 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
35070 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
35080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
35090 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
350a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
350b0 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
350c0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
350d0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
350e0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
350f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
35100 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
35110 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
35120 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
35130 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
35140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35150 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
35160 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
35170 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
35180 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
35190 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
351a0 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
351b0 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
351c0 53 79 6e 63 53 70 69 6c 6c 20 66 6c 61 67 20 74  SyncSpill flag t
351d0 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
351e0 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
351f0 6c 6c 6f 77 0a 20 20 20 20 2a 2a 20 61 20 6a 6f  llow.    ** a jo
35200 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
35210 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
35220 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
35230 72 6e 61 6c 65 64 20 62 79 0a 20 20 20 20 2a 2a  rnaled by.    **
35240 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
35250 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
35260 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
35270 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35280 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d  >doNotSyncSpill=
35290 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
352a0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
352b0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ++;..    /* This
352c0 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
352d0 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
352e0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
352f0 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
35300 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
35310 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
35320 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
35330 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
35340 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
35350 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
35360 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
35370 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
35380 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
35390 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
353a0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
353b0 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
353c0 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e  Count = pPager->
353d0 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  dbSize;.    if( 
353e0 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
353f0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
35400 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
35410 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
35420 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
35430 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
35440 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
35450 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
35460 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
35470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
35480 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
35490 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
354a0 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
354b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
354c0 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
354d0 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
354e0 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
354f0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
35500 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
35510 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
35520 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
35530 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
35540 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
35550 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d      if( pg==pPg-
35560 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65  >pgno || !sqlite
35570 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
35580 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
35590 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pg) ){.        i
355a0 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
355b0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
355c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
355d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
355e0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
355f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
35600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
35620 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
35630 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35640 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
35650 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
35660 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
35670 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
35680 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
35690 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
356a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
356b0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
356c0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
356d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
356e0 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
356f0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
35700 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
35710 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
35720 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
35730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
35740 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
35750 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
35760 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
35770 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
35780 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
35790 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
357a0 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20  YNC flag is set 
357b0 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
357c0 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
357d0 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
357e0 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
357f0 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
35800 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
35810 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
35820 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
35830 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
35840 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
35850 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
35860 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
35870 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
35880 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
35890 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
358a0 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
358b0 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
358c0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
358d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
358e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
358f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65  =SQLITE_OK && ne
35900 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
35910 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
35920 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
35930 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b  ; ii<nPage; ii++
35940 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
35950 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
35960 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
35970 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
35980 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
35990 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c         pPage->fl
359a0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
359b0 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
359c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
359d0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
359e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
359f0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
35a00 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
35a10 6e 63 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  ncSpill==1 );.  
35a20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
35a30 79 6e 63 53 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65  yncSpill--;.  }e
35a40 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
35a50 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
35a60 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
35a70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
35a80 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
35a90 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
35aa0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
35ab0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
35ac0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
35ad0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
35ae0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
35af0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
35b00 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
35b10 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
35b20 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
35b30 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
35b40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
35b50 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
35b60 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
35b70 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
35b80 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
35b90 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
35ba0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
35bb0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
35bc0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
35bd0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
35be0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
35bf0 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
35c00 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
35c10 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
35c20 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
35c30 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
35c40 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
35c50 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
35c60 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
35c70 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
35c80 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
35c90 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
35ca0 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
35cb0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
35cc0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
35cd0 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
35ce0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
35cf0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
35d00 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
35d10 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
35d20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
35d30 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
35d40 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
35d50 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
35d60 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
35d70 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
35d80 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
35d90 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
35da0 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
35db0 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
35dc0 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
35dd0 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
35de0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
35df0 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
35e00 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
35e10 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
35e20 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
35e30 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
35e40 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
35e50 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
35e60 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
35e70 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
35e80 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
35e90 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
35ea0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
35eb0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
35ec0 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
35ed0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
35ee0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
35ef0 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
35f00 49 54 45 3b 0a 20 20 20 20 70 61 67 65 72 5f 73  ITE;.    pager_s
35f10 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
35f20 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
35f30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35f40 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
35f50 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nt the value of 
35f60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35f70 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75  e .** change-cou
35f80 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  nter, stored as 
35f90 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 4-byte big-end
35fa0 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72  ian integer star
35fb0 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65  ting at .** byte
35fc0 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
35fd0 65 20 70 61 67 65 72 20 66 69 6c 65 2e 20 20 54  e pager file.  T
35fe0 68 65 20 73 65 63 6f 6e 64 61 72 79 20 63 68 61  he secondary cha
35ff0 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 74 0a 2a  nge counter at.*
36000 2a 20 39 32 20 69 73 20 61 6c 73 6f 20 75 70 64  * 92 is also upd
36010 61 74 65 64 2c 20 61 73 20 69 73 20 74 68 65 20  ated, as is the 
36020 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
36030 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74 20  umber at offset 
36040 39 36 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 74 68  96..**.** But th
36050 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
36060 69 66 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63  if the pPager->c
36070 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
36080 6c 61 67 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a  lag is false..**
36090 20 54 6f 20 61 76 6f 69 64 20 65 78 63 65 73 73   To avoid excess
360a0 20 63 68 75 72 6e 69 6e 67 20 6f 66 20 70 61 67   churning of pag
360b0 65 20 31 2c 20 74 68 65 20 75 70 64 61 74 65 20  e 1, the update 
360c0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 6f 6e 63  only happens onc
360d0 65 2e 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  e..** See also t
360e0 68 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63  he pager_write_c
360f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 72  hangecounter() r
36100 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
36110 20 61 6e 20 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74   an .** uncondit
36120 69 6f 6e 61 6c 20 75 70 64 61 74 65 20 6f 66 20  ional update of 
36130 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
36140 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ers..**.** If th
36150 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66  e isDirectMode f
36160 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  lag is zero, the
36170 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  n this is done b
36180 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  y calling .** sq
36190 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
361a0 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  ) on page 1, the
361b0 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  n modifying the 
361c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
361d0 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e  ** page data. In
361e0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
361f0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61  ile will be upda
36200 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72  ted when the cur
36210 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
36220 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
36230 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69  ..**.** The isDi
36240 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61  rectMode flag ma
36250 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65  y only be non-ze
36260 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72  ro if the librar
36270 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a  y was compiled.*
36280 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  * with the SQLIT
36290 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
362a0 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69  WRITE macro defi
362b0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
362c0 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63  e,.** if isDirec
362d0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
362e0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
362f0 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
36300 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20   directly.** by 
36310 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74  writing an updat
36320 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  ed version of pa
36330 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c  ge 1 using a cal
36340 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c  l to the .** sql
36350 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75  ite3OsWrite() fu
36360 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
36370 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
36380 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
36390 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
363a0 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b  t isDirectMode){
363b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
363c0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
363d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
363e0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
363f0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
36400 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
36410 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
36420 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
36430 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
36440 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
36450 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20  ;..  /* Declare 
36460 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  and initialize c
36470 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
36480 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74  'isDirect'. If t
36490 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77  he.  ** atomic-w
364a0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
364b0 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20  n is enabled in 
364c0 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e  this build, then
364d0 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69   isDirect.  ** i
364e0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
364f0 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   the value passe
36500 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63  d as the isDirec
36510 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a  tMode parameter.
36520 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e    ** to this fun
36530 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
36540 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73  , it is always s
36550 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  et to zero..  **
36560 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69  .  ** The idea i
36570 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74  s that if the at
36580 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
36590 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20  ization is not. 
365a0 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63   ** enabled at c
365b0 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
365c0 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d   compiler can om
365d0 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a  it the tests of.
365e0 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20    ** 'isDirect' 
365f0 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61  below, as well a
36600 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c  s the block encl
36610 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  osed in the.  **
36620 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29   "if( isDirect )
36630 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a  " condition..  *
36640 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
36650 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
36660 52 49 54 45 0a 23 20 64 65 66 69 6e 65 20 44 49  RITE.# define DI
36670 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20 20 61 73  RECT_MODE 0.  as
36680 73 65 72 74 28 20 69 73 44 69 72 65 63 74 4d 6f  sert( isDirectMo
36690 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45  de==0 );.  UNUSE
366a0 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73 44 69  D_PARAMETER(isDi
366b0 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65  rectMode);.#else
366c0 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
366d0 5f 4d 4f 44 45 20 69 73 44 69 72 65 63 74 4d 6f  _MODE isDirectMo
366e0 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  de.#endif..  if(
366f0 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
36700 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61  CountDone && pPa
36710 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
36720 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
36730 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
36740 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20     /* Reference 
36750 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  to page 1 */..  
36760 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
36770 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69  r->tempFile && i
36780 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
36790 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  ) );..    /* Ope
367a0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
367b0 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
367c0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
367d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
367e0 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
367f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
36800 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d  PgHdr==0 || rc==
36810 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
36820 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65    /* If page one
36830 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63   was fetched suc
36840 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74  cessfully, and t
36850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
36860 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  not.    ** opera
36870 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d  ting in direct-m
36880 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31  ode, make page 1
36890 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65 6e   writable.  When
368a0 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20   not in .    ** 
368b0 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61 67  direct mode, pag
368c0 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68 65  e 1 is always he
368d0 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64 20  ld in cache and 
368e0 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72 47  hence the PagerG
368f0 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  et().    ** abov
36900 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63 63  e is always succ
36910 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20 74  essful - hence t
36920 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63 3d  he ALWAYS on rc=
36930 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20 20  =SQLITE_OK..    
36940 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52 45  */.    if( !DIRE
36950 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41 59  CT_MODE && ALWAY
36960 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  S(rc==SQLITE_OK)
36970 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
36980 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36990 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a  (pPgHdr);.    }.
369a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
369b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
369c0 2f 2a 20 41 63 74 75 61 6c 6c 79 20 64 6f 20 74  /* Actually do t
369d0 68 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65  he update of the
369e0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
369f0 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 77  */.      pager_w
36a00 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
36a10 65 72 28 70 50 67 48 64 72 29 3b 0a 0a 20 20 20  er(pPgHdr);..   
36a20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67     /* If running
36a30 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c   in direct mode,
36a40 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   write the conte
36a50 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f  nts of page 1 to
36a60 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20   the file. */.  
36a70 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f 4d      if( DIRECT_M
36a80 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ODE ){.        c
36a90 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 3b  onst void *zBuf;
36aa0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36ab0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
36ac0 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
36ad0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
36ae0 70 50 67 48 64 72 2d 3e 70 44 61 74 61 2c 20 31  pPgHdr->pData, 1
36af0 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 6, rc=SQLITE_N
36b00 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a 20 20 20  OMEM, zBuf);.   
36b10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36b20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36b30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36b40 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
36b50 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
36b60 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
36b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36b80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36b90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
36ba0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
36bb0 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
36bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
36bd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61  lse{.        pPa
36be0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
36bf0 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
36c00 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
36c10 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65  Release the page
36c20 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
36c30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36c40 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
36c50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
36c60 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
36c70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
36c80 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
36c90 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
36ca0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 0a  emory databases.
36cb0 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68  ** or pages with
36cc0 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e   the Pager.noSyn
36cd0 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  c flag set..**.*
36ce0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
36cf0 20 6f 72 20 69 66 20 63 61 6c 6c 65 64 20 6f 6e   or if called on
36d00 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
36d10 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
36d20 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
36d30 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
36d40 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
36d50 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
36d60 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
36d70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36d80 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
36d90 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
36da0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
36db0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
36dc0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
36dd0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
36de0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
36df0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
36e00 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
36e10 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  );.  }else if( i
36e20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
36e30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
36e40 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 73   !MEMDB );.    s
36e50 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
36e60 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  rol(pPager->fd, 
36e70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59 4e  SQLITE_FCNTL_SYN
36e80 43 5f 4f 4d 49 54 54 45 44 2c 20 28 76 6f 69 64  C_OMITTED, (void
36e90 20 2a 29 26 72 63 29 3b 0a 20 20 7d 0a 20 20 72   *)&rc);.  }.  r
36ea0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36eb0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
36ec0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
36ed0 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72 69 74  led while a writ
36ee0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
36ef0 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72 6f   active in.** ro
36f00 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20 63  llback. If the c
36f10 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
36f20 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20 63  WAL mode, this c
36f30 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  all is a no-op. 
36f40 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
36f50 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
36f60 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
36f70 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55 53  y have an EXCLUS
36f80 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20  IVE lock on .** 
36f90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36fa0 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  e, an attempt is
36fb0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
36fc0 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  one..**.** If th
36fd0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
36fe0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
36ff0 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74 20   or the attempt 
37000 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73 0a  to obtain it is.
37010 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  ** successful, o
37020 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  r the connection
37030 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c   is in WAL mode,
37040 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
37050 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65 72  turned..** Other
37060 77 69 73 65 2c 20 65 69 74 68 65 72 20 53 51 4c  wise, either SQL
37070 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20 53  ITE_BUSY or an S
37080 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
37090 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
370a0 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  * returned..*/.i
370b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  nt sqlite3PagerE
370c0 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61 67  xclusiveLock(Pag
370d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
370e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
370f0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
37100 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37110 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37120 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  OD .       || pP
37130 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37140 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37150 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67   .       || pPag
37160 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
37170 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
37180 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
37190 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
371a0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
371b0 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65 57  if( 0==pagerUseW
371c0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
371d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
371e0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
371f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
37200 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
37210 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
37220 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
37230 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
37240 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
37250 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
37260 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
37270 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
37280 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
37290 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
372a0 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
372b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
372c0 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
372d0 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
372e0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
372f0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
37300 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
37310 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
37320 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
37330 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a  ne ensures that:
37340 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  .**.**   * The d
37350 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
37360 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75  nge-counter is u
37370 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74  pdated,.**   * t
37380 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
37390 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65  nced (unless the
373a0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
373b0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73  timization is us
373c0 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20  ed),.**   * all 
373d0 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20  dirty pages are 
373e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
373f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a  atabase file, .*
37400 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
37410 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  se file is trunc
37420 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65  ated (if require
37430 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  d), and.**   * t
37440 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37450 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
37460 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
37470 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  hat remains to c
37480 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
37490 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61  ction is to fina
374a0 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65  lize .** (delete
374b0 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  , truncate or ze
374c0 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72  ro the first par
374d0 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61  t of) the journa
374e0 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64  l file (or .** d
374f0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
37500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
37510 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
37520 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
37530 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
37540 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
37550 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
37560 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
37570 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
37580 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
37590 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
375a0 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61   If the final pa
375b0 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63  rameter - noSync
375c0 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e   - is true, then
375d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
375e0 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20  le itself.** is 
375f0 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20  not synced. The 
37600 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c  caller must call
37610 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
37620 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a  c() directly to.
37630 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  ** sync the data
37640 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
37650 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50   calling CommitP
37660 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c  haseTwo() to del
37670 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ete the.** journ
37680 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  al file in this 
37690 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  case..*/.int sql
376a0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
376b0 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72  haseOne(.  Pager
376c0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
376d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
376e0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
376f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
37700 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
37710 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
37720 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
37730 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  al name */.  int
37740 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20   noSync         
37750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37760 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65  True to omit the
37770 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62   xSync on the db
37780 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
37790 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
377a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
377b0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
377c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
377d0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
377e0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
377f0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37800 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37810 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
37820 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37830 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37840 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
37850 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
37860 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
37870 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  R.  );.  assert(
37880 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
37890 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  ate(pPager) );..
378a0 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20    /* If a prior 
378b0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
378c0 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f  report that erro
378d0 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66  r again. */.  if
378e0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
378f0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
37900 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
37910 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  e;..  PAGERTRACE
37920 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
37930 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
37940 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
37950 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
37960 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
37970 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
37980 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ize));..  /* If 
37990 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  no database chan
379a0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
379b0 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  de, return early
379c0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
379d0 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
379e0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
379f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
37a00 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  OK;..  if( MEMDB
37a10 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
37a20 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
37a30 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
37a40 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
37a50 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
37a60 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  .    ** function
37a70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
37a80 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
37a90 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20  mostly a no-op. 
37aa0 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20 20   However, any.  
37ab0 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20 70    ** backup in p
37ac0 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74 6f  rogress needs to
37ad0 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
37ae0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
37af0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
37b00 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
37b10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
37b20 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
37b30 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 50  ager) ){.      P
37b40 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71  gHdr *pList = sq
37b50 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
37b60 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
37b70 61 63 68 65 29 3b 0a 20 20 20 20 20 20 50 67 48  ache);.      PgH
37b80 64 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d 20 30  dr *pPageOne = 0
37b90 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
37ba0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
37bb0 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 74 20  /* Must have at 
37bc0 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65 20 66  least one page f
37bd0 6f 72 20 74 68 65 20 57 41 4c 20 63 6f 6d 6d 69  or the WAL commi
37be0 74 20 66 6c 61 67 2e 0a 20 20 20 20 20 20 20 20  t flag..        
37bf0 2a 2a 20 54 69 63 6b 65 74 20 5b 32 64 31 61 35  ** Ticket [2d1a5
37c00 63 36 37 64 66 63 32 33 36 33 65 34 34 66 32 39  c67dfc2363e44f29
37c10 64 39 62 62 64 35 37 66 5d 20 32 30 31 31 2d 30  d9bbd57f] 2011-0
37c20 35 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20 20 20  5-18 */.        
37c30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37c40 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
37c50 26 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20 20 20  &pPageOne);.    
37c60 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 67      pList = pPag
37c70 65 4f 6e 65 3b 0a 20 20 20 20 20 20 20 20 70 4c  eOne;.        pL
37c80 69 73 74 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ist->pDirty = 0;
37c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
37ca0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
37cb0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
37cc0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
37cd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
37ce0 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
37cf0 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20 70 50  Pager, pList, pP
37d00 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20 31 2c  ager->dbSize, 1,
37d10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
37d20 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
37d30 3f 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  ? pPager->syncFl
37d40 61 67 73 20 3a 20 30 29 0a 20 20 20 20 20 20 20  ags : 0).       
37d50 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
37d60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
37d70 72 65 66 28 70 50 61 67 65 4f 6e 65 29 3b 0a 20  ref(pPageOne);. 
37d80 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
37da0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
37db0 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
37dc0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20  pPCache);.      
37dd0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
37de0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
37df0 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  ing block update
37e00 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
37e10 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f  nter. Exactly ho
37e20 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f  w it.      ** do
37e30 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
37e40 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
37e50 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
37e60 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
37e70 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  .      ** was en
37e80 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
37e90 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
37ea0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
37eb0 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20  eets the .      
37ec0 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65  ** runtime crite
37ed0 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f  ria to use the o
37ee0 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20  peration: .     
37ef0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
37f00 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * The file-syste
37f10 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
37f20 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
37f30 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  erty for.      *
37f40 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
37f50 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
37f60 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20   and .      **  
37f70 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    * This commit 
37f80 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
37f90 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
37fa0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
37fb0 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74     **    * Exact
37fc0 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
37fd0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
37fe0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
37ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
38000 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
38010 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
38020 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
38030 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
38040 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
38050 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
38060 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
38070 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
38080 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  led to update th
38090 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a  e change.      *
380a0 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e  * counter in 'in
380b0 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66  direct-mode'. If
380c0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
380d0 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  n is compiled in
380e0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73   but.      ** is
380f0 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20   not applicable 
38100 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  to this transact
38110 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  ion, call sqlite
38120 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29  3JournalCreate()
38130 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b  .      ** to mak
38140 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e  e sure the journ
38150 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75  al file has actu
38160 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65  ally been create
38170 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20  d, then call.   
38180 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
38190 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
381a0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
381b0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e  hange-counter in
381c0 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 20 20   indirect.      
381d0 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 20 20  ** mode. .      
381e0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  **.      ** Othe
381f0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70  rwise, if the op
38200 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f  timization is bo
38210 74 68 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61  th enabled and a
38220 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20  pplicable,.     
38230 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70 61   ** then call pa
38240 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
38250 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61  ounter() to upda
38260 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
38270 75 6e 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69  unter.      ** i
38280 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e  n 'direct' mode.
38290 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
382a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
382b0 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20  ill never be.   
382c0 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f     ** created fo
382d0 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
382e0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 23  on..      */.  #
382f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
38300 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
38310 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
38320 67 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  g;.      assert(
38330 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
38340 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20  jfd) .          
38350 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
38360 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
38370 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
38380 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
38390 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
383a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
383b0 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
383c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
383d0 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
383e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
383f0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
38400 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c  journalOff==jrnl
38410 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65  BufferSize(pPage
38420 72 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  r) .       && pP
38430 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50  ager->dbSize>=pP
38440 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
38450 0a 20 20 20 20 20 20 20 26 26 20 28 30 3d 3d 28  .       && (0==(
38460 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
38470 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
38480 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c  ger->pPCache)) |
38490 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79  | 0==pPg->pDirty
384a0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
384b0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
384c0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
384d0 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20  counter via the 
384e0 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74  direct-write met
384f0 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20  hod. The .      
38500 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
38510 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
38520 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
38530 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
38540 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 20 20  page 1 .        
38550 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ** to include th
38560 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65  e updated change
38570 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
38580 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a  n write page 1 .
38590 20 20 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63          ** direc
385a0 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
385b0 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
385c0 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
385d0 77 72 69 74 65 20 0a 20 20 20 20 20 20 20 20 2a  write .        *
385e0 2a 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  * property of th
385f0 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
38600 65 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65  em, this is safe
38610 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
38620 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
38630 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
38640 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
38650 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
38660 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38670 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
38680 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
38690 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
386a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
386b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
386c0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
386d0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
386e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
386f0 20 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20   #else.      rc 
38700 3d 20 70 61 67 65