/ Hex Artifact Content
Login

Artifact d9858b47b216e3bcb0431bd50ef17d070ac0b92c:


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 73 79 6e 63 5f 66 6c   */.  u8 sync_fl
71b0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
71c0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43    /* One of SYNC
71d0: 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f  _NORMAL or SYNC_
71e0: 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d  FULL */.  u8 tem
71f0: 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  pFile;          
7200: 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
7210: 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  me is a temporar
7220: 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72  y file */.  u8 r
7230: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7240: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7250: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7260: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7270: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7290: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
72a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
72b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
72c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
72f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7300: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7310: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7320: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7330: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7340: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7350: 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c 61  e opertion.  Cla
7360: 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69  ss members not i
7370: 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65  n this block are
7380: 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20   either fixed.  
7390: 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ** when the page
73a0: 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74  r is first creat
73b0: 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20  ed or else only 
73c0: 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72  change when ther
73d0: 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e  e is a.  ** sign
73e0: 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61  ificant mode cha
73f0: 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61  nge (such as cha
7400: 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73  nging the page_s
7410: 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  ize, locking_mod
7420: 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a  e,.  ** or the j
7430: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46  ournal_mode).  F
7440: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77  rom another view
7450: 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65  , these class me
7460: 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20  mbers describe. 
7470: 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20   ** the "state" 
7480: 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68  of the pager, wh
7490: 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20  ile other class 
74a0: 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65  members describe
74b0: 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69   the.  ** "confi
74c0: 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65  guration" of the
74d0: 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75   pager..  */.  u
74e0: 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20  8 eState;       
74f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
7500: 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c  ger state (OPEN,
7510: 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f   READER, WRITER_
7520: 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75  LOCKED..) */.  u
7530: 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  8 eLock;        
7540: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
7550: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
7560: 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
7570: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
7580: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
7590: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
75a0: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
75b0: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
75c0: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
75d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
75e0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
75f0: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
7600: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
7610: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c  /.  u8 doNotSpil
7620: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
7630: 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  /* Do not spill 
7640: 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e  the cache when n
7650: 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20  on-zero */.  u8 
7660: 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b 20  doNotSyncSpill; 
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e           /* Do n
7680: 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74 68  ot do a spill th
7690: 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e 6c  at requires jrnl
76a0: 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73 75   sync */.  u8 su
76b0: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
76c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
76d0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
76e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
76f0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7710: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
7720: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
7730: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
7740: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
7750: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
7760: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
7770: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
7780: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
7790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
77a0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
77b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
77c0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ile */.  Pgno db
77d0: 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  HintSize;       
77e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61       /* Value pa
77f0: 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49  ssed to FCNTL_SI
7800: 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a  ZE_HINT call */.
7810: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7830: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
7840: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
7850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
7880: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
7890: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
78a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
78b0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
78c0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
78d0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
78e0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
78f0: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
7900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7910: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
7920: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
7930: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7940: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
7950: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
7960: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
7970: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
7980: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
7990: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
79a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
79b0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
79c0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
79d0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79e0: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
79f0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a00: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
7a10: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
7a20: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
7a30: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a40: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
7a50: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
7a60: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
7a70: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
7a80: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
7a90: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
7aa0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
7ab0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
7ac0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
7ad0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
7ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
7af0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
7b00: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
7b10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
7b20: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
7b30: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
7b40: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
7b50: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
7b60: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
7b70: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
7b80: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
7b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7ba0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
7bb0: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
7bc0: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
7bd0: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
7be0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
7bf0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
7c00: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
7c10: 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20  /.  /*.  ** End 
7c20: 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79  of the routinely
7c30: 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20  -changing class 
7c40: 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a  members.  ******
7c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c90: 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45  *****/..  u16 nE
7ca0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
7cb0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
7cc0: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
7cd0: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
7ce0: 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65  age */.  i16 nRe
7cf0: 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20  serve;          
7d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7d10: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  f unused bytes a
7d20: 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61  t end of each pa
7d30: 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46  ge */.  u32 vfsF
7d40: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7d50: 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72      /* Flags for
7d60: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
7d70: 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65  en() */.  u32 se
7d80: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
7d90: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
7da0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
7db0: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
7dc0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7de0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7df0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
7e00: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7e20: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
7e30: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
7e40: 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ase */.  i64 jou
7e50: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
7e60: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d       /* Size lim
7e70: 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  it for persisten
7e80: 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  t journal files 
7e90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
7ea0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
7eb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
7ec0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7ed0: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
7ee0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
7ef0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
7f00: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
7f10: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
7f20: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
7f30: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
7f40: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
7f50: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
7f60: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
7f70: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
7f80: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
7f90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7fa0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
7fb0: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
7fc0: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
7fd0: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
7fe0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
7ff0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
8000: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
8010: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
8020: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
8030: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
8040: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
8050: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
8060: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
8070: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8080: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
8090: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
80a0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
80b0: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
80c0: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
80d0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ata */.  void (*
80e0: 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
80f0: 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20  void*,int,int); 
8100: 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67  /* Notify of pag
8110: 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a  e size changes *
8120: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8130: 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20  cFree)(void*);  
8140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
8150: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
8160: 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64   codec */.  void
8170: 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20   *pCodec;       
8180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
8190: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
81a0: 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a  dec... methods *
81b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
81c0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
81d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
81e0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
81f0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
8200: 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  use */.  PCache 
8210: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
8220: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
8230: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
8240: 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ject */.#ifndef 
8250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
8260: 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20    Wal *pWal;    
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8280: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
8290: 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61   used by "journa
82a0: 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20  l_mode=wal" */. 
82b0: 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20   char *zWal;    
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82d0: 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72  File name for wr
82e0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f  ite-ahead log */
82f0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
8300: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8310: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
8320: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
8330: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
8340: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
8350: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8360: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
8370: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
8380: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
8390: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
83a0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
83b0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
83c0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
83d0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
83e0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
83f0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8400: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
8410: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8420: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
8430: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
8440: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8450: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
8460: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
8470: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
8480: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8490: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
84a0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
84b0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
84c0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
84d0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
84e0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
84f0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
8500: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
8510: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
8520: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
8530: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
8540: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
8550: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
8560: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
8570: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
8580: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
8590: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
85a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
85b0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
85c0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
85d0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
85e0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
85f0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
8600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
8610: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
8620: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
8630: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
8640: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
8650: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
8660: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
8670: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
8680: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
8690: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
86a0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
86b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
86c0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
86d0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
86e0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
86f0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
8700: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
8710: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
8720: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
8730: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
8740: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
8750: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8760: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
8770: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
8780: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
8790: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
87a0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
87b0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
87c0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
87d0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
87e0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
87f0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
8800: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
8810: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
8820: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
8830: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
8840: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
8850: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
8860: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
8870: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
8880: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
8890: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
88a0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
88b0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
88c0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
88d0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
88e0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
88f0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
8900: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
8910: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
8920: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
8930: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
8940: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
8950: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
8960: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
8970: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
8980: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
8990: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
89a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
89b0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
89c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
89d0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
89e0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
89f0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
8a00: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
8a10: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
8a20: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
8a30: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
8a40: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
8a50: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
8a60: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
8a70: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
8a80: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
8a90: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
8aa0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
8ab0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
8ac0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
8ad0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
8ae0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
8af0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
8b00: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
8b10: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
8b20: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
8b30: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
8b40: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
8b50: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
8b60: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
8b70: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
8b80: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
8b90: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
8ba0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8bb0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
8bc0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
8bd0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
8be0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
8bf0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
8c00: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
8c10: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
8c20: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
8c30: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
8c40: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
8c50: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
8c60: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
8c70: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
8c80: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
8c90: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
8ca0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
8cb0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
8cc0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
8cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
8ce0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
8cf0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
8d00: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
8d10: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
8d20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
8d30: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
8d40: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
8d50: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
8d60: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
8d70: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
8d80: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
8d90: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
8da0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
8db0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
8dc0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
8dd0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
8de0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
8df0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
8e00: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
8e10: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
8e20: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
8e30: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
8e40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
8e50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8e60: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
8e70: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
8e80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
8e90: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
8ea0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
8eb0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
8ec0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
8ed0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
8ee0: 66 20 74 68 69 73 20 70 61 67 65 72 20 75 73 65  f this pager use
8ef0: 73 20 61 20 77 72 69 74 65 2d 61 68 65 61 64 20  s a write-ahead 
8f00: 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f 66 20 74  log instead of t
8f10: 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c  he usual.** roll
8f20: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74  back journal. Ot
8f30: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
8f40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
8f50: 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61 74 69 63  _OMIT_WAL.static
8f60: 20 69 6e 74 20 70 61 67 65 72 55 73 65 57 61 6c   int pagerUseWal
8f70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
8f80: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
8f90: 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23  r->pWal!=0);.}.#
8fa0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
8fb0: 67 65 72 55 73 65 57 61 6c 28 78 29 20 30 0a 23  gerUseWal(x) 0.#
8fc0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 6f 6c   define pagerRol
8fd0: 6c 62 61 63 6b 57 61 6c 28 78 29 20 30 0a 23 20  lbackWal(x) 0.# 
8fe0: 64 65 66 69 6e 65 20 70 61 67 65 72 57 61 6c 46  define pagerWalF
8ff0: 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79 2c 7a 29  rames(v,w,x,y,z)
9000: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9010: 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
9020: 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  t(z) SQLITE_OK.#
9030: 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65 67   define pagerBeg
9040: 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
9050: 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  n(z) SQLITE_OK.#
9060: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4e  endif..#ifndef N
9070: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
9080: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
9090: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
90a0: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
90b0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ;.**.** This fun
90c0: 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79 20  ction runs many 
90d0: 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20 74  asserts to try t
90e0: 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73 74  o find inconsist
90f0: 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68 65  encies in.** the
9100: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
9110: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
9120: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
9130: 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  nt assert_pager_
9140: 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b  state(Pager *p){
9150: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
9160: 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61 74   = p;..  /* Stat
9170: 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 2e  e must be valid.
9180: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9190: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
91a0: 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  PEN.       || p-
91b0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
91c0: 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c 20  EADER.       || 
91d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
91e0: 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
91f0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9200: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9210: 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
9220: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9230: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9240: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9250: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9260: 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20 20  TER_FINISHED.   
9270: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9280: 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20 20  ==PAGER_ERROR.  
9290: 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64 6c  );..  /* Regardl
92a0: 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ess of the curre
92b0: 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d 70  nt state, a temp
92c0: 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  -file connection
92d0: 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73 0a   always behaves.
92e0: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68 61    ** as if it ha
92f0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
9300: 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
9310: 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65 76  ase file. It nev
9320: 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a 20  er updates.  ** 
9330: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
9340: 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68 65  er field, so the
9350: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
9360: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
9370: 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
9380: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9390: 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d  =0 || p->eLock==
93a0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
93b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  ;.  assert( p->t
93c0: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
93d0: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
93e0: 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20 49  tDone );..  /* I
93f0: 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61 6c  f the useJournal
9400: 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20   flag is clear, 
9410: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9420: 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e 20   must be "OFF". 
9430: 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68 65  .  ** And if the
9440: 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
9450: 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75 72   "OFF", the jour
9460: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e 6f  nal file must no
9470: 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a  t be open..  */.
9480: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75    assert( p->jou
9490: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
94a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
94b0: 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  || p->useJournal
94c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
94d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
94e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
94f0: 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  OFF || !isOpen(p
9500: 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
9510: 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44 42  Check that MEMDB
9520: 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63 2e   implies noSync.
9530: 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   And an in-memor
9540: 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63 65  y journal. Since
9550: 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61 6e   .  ** this mean
9560: 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  s an in-memory p
9570: 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e 6f  ager performs no
9580: 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20 63   IO at all, it c
9590: 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72 20  annot encounter 
95a0: 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51 4c  .  ** either SQL
95b0: 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c  ITE_IOERR or SQL
95c0: 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67 20  ITE_FULL during 
95d0: 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69 6c  rollback or whil
95e0: 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20 20  e finalizing .  
95f0: 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** a journal fil
9600: 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68 65  e. (although the
9610: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
9620: 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  al implementatio
9630: 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74 75  n may .  ** retu
9640: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
9650: 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65 20  NOMEM while the 
9660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9670: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e 20  being written). 
9680: 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 72  It .  ** is ther
9690: 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  efore not possib
96a0: 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  le for an in-mem
96b0: 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e 74  ory pager to ent
96c0: 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20 20  er the ERROR .  
96d0: 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20  ** state..  */. 
96e0: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
96f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53    assert( p->noS
9700: 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ync );.    asser
9710: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9720: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
9730: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
9740: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
9750: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9760: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9770: 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72      );.    asser
9780: 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41  t( p->eState!=PA
9790: 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e  GER_ERROR && p->
97a0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
97b0: 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  EN );.    assert
97c0: 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29  ( pagerUseWal(p)
97d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
97e0: 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44   If changeCountD
97f0: 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45  one is set, a RE
9800: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67  SERVED lock or g
9810: 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
9820: 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  eld.  ** on the 
9830: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  file..  */.  ass
9840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61  ert( pPager->cha
9850: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20  ngeCountDone==0 
9860: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
9870: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
9880: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9890: 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
98a0: 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68  OCK );..  switch
98b0: 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  ( p->eState ){. 
98c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50     case PAGER_OP
98d0: 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  EN:.      assert
98e0: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
98f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9900: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9910: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
9920: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
9930: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
9940: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
9950: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
9960: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
9970: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9980: 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20  GER_READER:.    
9990: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
99a0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
99b0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
99c0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
99d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
99e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
99f0: 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
9a00: 4f 43 4b 20 7c 7c 20 70 2d 3e 6e 6f 52 65 61 64  OCK || p->noRead
9a10: 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 62 72  lock );.      br
9a20: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9a30: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
9a40: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
9a50: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
9a60: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
9a70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9a80: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
9a90: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
9aa0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
9ab0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
9ac0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9ad0: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
9ae0: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
9af0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9b00: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
9b10: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
9b20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9b30: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
9b40: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
9b50: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
9b60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
9b70: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
9b80: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
9b90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9ba0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9bb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
9bc0: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
9bd0: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9be0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
9bf0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
9c00: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
9c10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9c20: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9c30: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
9c40: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
9c50: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
9c60: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
9c70: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
9c80: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
9c90: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
9ca0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
9cb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
9cc0: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
9cd0: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
9ce0: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
9cf0: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
9d00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
9d10: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
9d20: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
9d30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
9d40: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
9d50: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
9d60: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9d70: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9d80: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61  OCK );.        a
9d90: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9da0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9db0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9dc0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9dd0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9de0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9df0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e10: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
9e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9e30: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9e40: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9e50: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
9e60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9e70: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9e80: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
9e90: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
9ea0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
9eb0: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
9ec0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
9ed0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
9ee0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
9ef0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9f00: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
9f10: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
9f20: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
9f30: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
9f40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
9f50: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
9f60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
9f70: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
9f80: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
9f90: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9fa0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9fb0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
9fc0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
9fd0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
9fe0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
9ff0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a000: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a010: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a020: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a030: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a040: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a050: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a060: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a070: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a080: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a090: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0a0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a0b0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a0c0: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a0d0: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a0e0: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a0f0: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a100: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a110: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a120: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a130: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a140: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a150: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a160: 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  AL .      );.   
a170: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a180: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a190: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a1a0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a1b0: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a1c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a1d0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a1e0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a1f0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a200: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
a210: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
a220: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
a230: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
a240: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a250: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a260: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
a270: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a280: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
a290: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
a2a0: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a  ->pPCache)>0 );.
a2b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
a2c0: 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ..  return 1;.}.
a2d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
a2e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68 75 6d  pointer to a hum
a2f0: 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74 72 69  an readable stri
a300: 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63 20 62  ng in a static b
a310: 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61 69 6e  uffer.** contain
a320: 69 6e 67 20 74 68 65 20 73 74 61 74 65 20 6f 66  ing the state of
a330: 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
a340: 74 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  t passed as an a
a350: 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a 2a 2a  rgument. This.**
a360: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
a370: 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 64  be used within d
a380: 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20 65 78  ebuggers. For ex
a390: 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61 6c 74  ample, as an alt
a3a0: 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f 20 22  ernative.** to "
a3b0: 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22 20 69  print *pPager" i
a3c0: 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28 67 64  n gdb:.**.** (gd
a3d0: 62 29 20 70 72 69 6e 74 66 20 22 25 73 22 2c 20  b) printf "%s", 
a3e0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
a3f0: 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73 74 61  e(pPager).*/.sta
a400: 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e 74 5f  tic char *print_
a410: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
a420: 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69 63 20  r *p){.  static 
a430: 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34 5d 3b  char zRet[1024];
a440: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
a450: 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65 74 2c  intf(1024, zRet,
a460: 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61 6d 65  .      "Filename
a470: 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20  :      %s\n".   
a480: 20 20 20 22 53 74 61 74 65 3a 20 20 20 20 20 20     "State:      
a490: 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d 25 64     %s errCode=%d
a4a0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 3a  \n".      "Lock:
a4b0: 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e 22 0a            %s\n".
a4c0: 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67 20 6d        "Locking m
a4d0: 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ode:  locking_mo
a4e0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
a4f0: 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20 20 6a  Journal mode:  j
a500: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 5c 6e  ournal_mode=%s\n
a510: 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69 6e 67  ".      "Backing
a520: 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69 6c 65   store: tempFile
a530: 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75 73 65  =%d memDb=%d use
a540: 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a 20 20  Journal=%d\n".  
a550: 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20 20 20      "Journal:   
a560: 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66 3d 25      journalOff=%
a570: 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72 3d 25  lld journalHdr=%
a580: 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22 53 69  lld\n".      "Si
a590: 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64 62 73  ze:          dbs
a5a0: 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53 69 7a  ize=%d dbOrigSiz
a5b0: 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a 65 3d  e=%d dbFileSize=
a5c0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20 70 2d  %d\n".      , p-
a5d0: 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20  >zFilename.     
a5e0: 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41   , p->eState==PA
a5f0: 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20 20 20  GER_OPEN        
a600: 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a 0a 20      ? "OPEN" :. 
a610: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
a620: 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 20  ==PAGER_READER  
a630: 20 20 20 20 20 20 20 20 3f 20 22 52 45 41 44 45          ? "READE
a640: 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  R" :.        p->
a650: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
a660: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 3f 20  ITER_LOCKED   ? 
a670: 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 22 20  "WRITER_LOCKED" 
a680: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
a690: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
a6a0: 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22 57 52  R_CACHEMOD ? "WR
a6b0: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22 20 3a  ITER_CACHEMOD" :
a6c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a6d0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
a6e0: 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57 52 49  _DBMOD    ? "WRI
a6f0: 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20 20 20  TER_DBMOD" :.   
a700: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
a710: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a720: 49 53 48 45 44 20 3f 20 22 57 52 49 54 45 52 5f  ISHED ? "WRITER_
a730: 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20 20 20  FINISHED" :.    
a740: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a750: 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20 20 20  AGER_ERROR      
a760: 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22 20 3a       ? "ERROR" :
a770: 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20   "?error?".     
a780: 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72 43 6f   , (int)p->errCo
a790: 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 4c  de.      , p->eL
a7a0: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20 20 20  ock==NO_LOCK    
a7b0: 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43 4b 22       ? "NO_LOCK"
a7c0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c   :.        p->eL
a7d0: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
a7e0: 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56 45 44  CK   ? "RESERVED
a7f0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a800: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a810: 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55 53 49  LOCK  ? "EXCLUSI
a820: 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  VE" :.        p-
a830: 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  >eLock==SHARED_L
a840: 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41 52 45  OCK     ? "SHARE
a850: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a860: 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
a870: 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e 4f 57  OCK    ? "UNKNOW
a880: 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  N" : "?error?". 
a890: 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c 75 73       , p->exclus
a8a0: 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63 6c 75  iveMode ? "exclu
a8b0: 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61 6c 22  sive" : "normal"
a8c0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72  .      , p->jour
a8d0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a8e0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a8f0: 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22 20 3a  Y   ? "memory" :
a900: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
a910: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a920: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20  OURNALMODE_OFF  
a930: 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a 20 20      ? "off" :.  
a940: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a950: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a960: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20  NALMODE_DELETE  
a970: 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a 20 20   ? "delete" :.  
a980: 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c        p->journal
a990: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a9a0: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
a9b0: 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a 0a 20   ? "persist" :. 
a9c0: 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61         p->journa
a9d0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9e0: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
a9f0: 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22 20 3a  E ? "truncate" :
aa00: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
aa10: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
aa20: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
aa30: 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20 22 3f      ? "wal" : "?
aa40: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
aa50: 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69 6c 65  (int)p->tempFile
aa60: 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44 62 2c  , (int)p->memDb,
aa70: 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f 75 72   (int)p->useJour
aa80: 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a  nal.      , p->j
aa90: 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e 6a 6f  ournalOff, p->jo
aaa0: 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 2c  urnalHdr.      ,
aab0: 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a 65 2c   (int)p->dbSize,
aac0: 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69 67 53   (int)p->dbOrigS
aad0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 46  ize, (int)p->dbF
aae0: 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a 20 20  ileSize.  );..  
aaf0: 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 23  return zRet;.}.#
ab00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
ab10: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
ab20: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
ab30: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
ab40: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
ab50: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
ab60: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
ab70: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
ab80: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
ab90: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
aba0: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
abb0: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
abc0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
abd0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
abe0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
abf0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
ac00: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
ac10: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
ac20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
ac30: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
ac40: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
ac50: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
ac60: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
ac70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ac80: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
ac90: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
aca0: 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
acb0: 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
acc0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
acd0: 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ger;.  int i;.  
ace0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
acf0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ad00: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
ad10: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
ad20: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
ad30: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  [i];.    if( p->
ad40: 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26 20 30  nOrig>=pgno && 0
ad50: 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ==sqlite3BitvecT
ad60: 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  est(p->pInSavepo
ad70: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
ad80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
ad90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ada0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
adb0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
adc0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
add0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
ade0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
adf0: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
ae00: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
ae10: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69  return sqlite3Bi
ae20: 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e 70 50  tvecTest(pPg->pP
ae30: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
ae40: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a  , pPg->pgno);.}.
ae50: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
ae60: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
ae70: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
ae80: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
ae90: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
aea0: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
aeb0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
aec0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
aed0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
aee0: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
aef0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
af00: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
af10: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
af20: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
af30: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
af40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
af50: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
af60: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
af70: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
af80: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
af90: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
afa0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
afb0: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
afc0: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
afd0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
afe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
aff0: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
b000: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
b010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b020: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
b030: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
b040: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
b050: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
b060: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
b070: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
b080: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
b090: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
b0a0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b0b0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b0c0: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
b0d0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
b0e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
b0f0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
b100: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b110: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b120: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
b130: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
b140: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
b150: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
b160: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
b170: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
b180: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
b190: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
b1a0: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
b1b0: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
b1c0: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
b1d0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
b1e0: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
b1f0: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
b200: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
b210: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
b220: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
b230: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
b240: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
b250: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
b260: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
b270: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
b280: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
b290: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
b2a0: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
b2b0: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
b2c0: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
b2d0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
b2e0: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
b2f0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
b300: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
b310: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b320: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
b330: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
b340: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
b350: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b360: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
b370: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
b380: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
b390: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b3a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
b3b0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
b3c0: 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
b3d0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b3e0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
b3f0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
b400: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
b410: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
b420: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
b430: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
b440: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
b450: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
b460: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
b470: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b480: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
b490: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
b4a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
b4b0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
b4c0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b4d0: 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f  >eLock = (u8)eLo
b4e0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  ck;.    }.    IO
b4f0: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25  TRACE(("UNLOCK %
b500: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
b510: 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72   eLock)).  }.  r
b520: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b530: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61  ** Lock the data
b540: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
b550: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
b560: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53  must be either S
b570: 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52  HARED_LOCK,.** R
b580: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
b590: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
b5a0: 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
b5b0: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
b5c0: 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c   the.** Pager.eL
b5d0: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
b5e0: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
b5f0: 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78  state. .**.** Ex
b600: 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65  cept, if Pager.e
b610: 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55  Lock is set to U
b620: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e  NKNOWN_LOCK when
b630: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b640: 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f  s .** called, do
b650: 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75   not modify it u
b660: 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f  nless the new lo
b670: 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45  cking state is E
b680: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a  XCLUSIVE_LOCK. .
b690: 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  ** See the comme
b6a0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
b6b0: 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f  fine of UNKNOWN_
b6c0: 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
b6d0: 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74  anation .** of t
b6e0: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
b6f0: 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50  nt pagerLockDb(P
b700: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b710: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
b720: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b730: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b740: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
b750: 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44   eLock==RESERVED
b760: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
b770: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
b780: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
b790: 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70  eLock<eLock || p
b7a0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e  Pager->eLock==UN
b7b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20  KNOWN_LOCK ){.  
b7c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b7d0: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
b7e0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
b7f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
b800: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
b810: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
b820: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
b830: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
b840: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
b850: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
b860: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
b870: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b880: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
b890: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
b8a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
b8b0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
b8c0: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
b8d0: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
b8e0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
b8f0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
b900: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
b910: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
b920: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
b930: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
b940: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
b950: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
b960: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
b970: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
b980: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
b990: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
b9a0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
b9b0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
b9c0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
b9d0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
b9e0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
b9f0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
ba00: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
ba10: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
ba20: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
ba30: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
ba40: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
ba50: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
ba60: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
ba70: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
ba80: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
ba90: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
baa0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
bab0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
bac0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
bad0: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
bae0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
baf0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
bb00: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
bb10: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
bb20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bb30: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
bb40: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
bb50: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
bb60: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
bb70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
bb80: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
bb90: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
bba0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
bbb0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
bbc0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
bbd0: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
bbe0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
bbf0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bc10: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
bc20: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
bc30: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
bc60: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
bc70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bc80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
bc90: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
bca0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
bcb0: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
bcc0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
bcd0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bce0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
bcf0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
bd00: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
bd10: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
bd20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
bd30: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
bd40: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
bd50: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
bd60: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
bd70: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
bd80: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
bd90: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
bda0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
bdb0: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
bdc0: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
bdd0: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
bde0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
bdf0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
be00: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
be10: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
be20: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
be30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
be40: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
be50: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
be60: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
be70: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
be80: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
be90: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
bea0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
beb0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
bec0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
bed0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
bee0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
bef0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
bf00: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
bf10: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
bf20: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
bf30: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
bf40: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
bf50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bf60: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
bf70: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
bf80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
bf90: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
bfa0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
bfb0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
bfc0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
bfd0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
bfe0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
bff0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
c000: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
c010: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
c020: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
c030: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
c040: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
c050: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
c060: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
c070: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
c080: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
c090: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
c0a0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
c0b0: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
c0c0: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
c0d0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
c0e0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
c0f0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
c100: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
c110: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
c120: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
c130: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
c140: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
c150: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
c160: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
c170: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
c180: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
c190: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
c1a0: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
c1b0: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
c1c0: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
c1d0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
c1e0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
c1f0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
c200: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
c210: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
c220: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
c230: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
c240: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
c250: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
c260: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
c270: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
c280: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
c290: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
c2a0: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
c2b0: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
c2c0: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
c2d0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
c2e0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
c2f0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c300: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
c310: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
c320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c330: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
c340: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
c350: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c360: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
c370: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
c380: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
c390: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
c3a0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
c3b0: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
c3c0: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
c3d0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
c3e0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
c3f0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
c400: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
c410: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
c420: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
c430: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
c440: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
c450: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
c460: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
c470: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
c480: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
c490: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
c4a0: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
c4b0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
c4c0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
c4d0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
c4e0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
c4f0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
c500: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
c510: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
c520: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c530: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
c540: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c550: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
c560: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
c570: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
c580: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
c590: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
c5a0: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
c5b0: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
c5c0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
c5d0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
c5e0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
c5f0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
c600: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c610: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
c620: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
c630: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
c640: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
c650: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
c660: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
c670: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
c680: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
c690: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
c6a0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
c6b0: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
c6c0: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
c6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
c6e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
c6f0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
c700: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
c710: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
c720: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
c730: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
c740: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
c750: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
c760: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c770: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
c780: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c790: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
c7a0: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
c7b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
c7c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
c7d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
c7e0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
c7f0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
c800: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
c810: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
c820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c830: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c840: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
c850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
c860: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
c870: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c880: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
c890: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
c8a0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
c8b0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
c8c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
c8d0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
c8e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c8f0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
c900: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
c910: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
c920: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
c930: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
c940: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
c950: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
c960: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
c970: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
c980: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
c990: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
c9a0: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
c9b0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
c9c0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
c9d0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
c9e0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
c9f0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
ca00: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
ca10: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
ca20: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
ca30: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
ca40: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
ca50: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
ca60: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
ca70: 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20   &cksum)).   || 
ca80: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ca90: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
caa0: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
cab0: 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d   szJ-8)).   || m
cac0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
cad0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a  ournalMagic, 8).
cae0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
caf0: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
cb00: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
cb10: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
cb20: 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  -len)).  ){.    
cb30: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
cb40: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
cb50: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
cb60: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
cb70: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
cb80: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
cb90: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
cba0: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d   zMaster[u];.  }
cbb0: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
cbc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
cbd0: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
cbe0: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
cbf0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
cc00: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
cc10: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
cc20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cc30: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
cc40: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
cc50: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
cc60: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
cc70: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
cc80: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
cc90: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
cca0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
ccb0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
ccc0: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  */.    len = 0;.
ccd0: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
cce0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
ccf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cd00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
cd10: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  rn the offset of
cd20: 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e   the sector boun
cd30: 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64  dary at or immed
cd40: 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f  iately .** follo
cd50: 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69  wing the value i
cd60: 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
cd70: 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61  lOff, assuming a
cd80: 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65   sector .** size
cd90: 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74   of pPager->sect
cda0: 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a  orSize bytes..**
cdb0: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
cdc0: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
cdd0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  :.**.**   Pager.
cde0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20  journalOff      
cdf0: 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65      Return value
ce00: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
ce30: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
ce50: 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20  *   512         
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
ce70: 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20  2.**   100      
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20   512.**   2000  
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
cec0: 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e  static i64 journ
ced0: 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65  alHdrOffset(Page
cee0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
cef0: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
cf00: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
cf10: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
cf20: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
cf30: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
cf40: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
cf50: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
cf60: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
cf70: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
cf80: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
cf90: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
cfa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
cfb0: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
cfc0: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
cfd0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
cfe0: 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
cff0: 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n offset;.}../*.
d000: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
d010: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
d020: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d030: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
d040: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d050: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
d060: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d070: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77  e has not been w
d080: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74  ritten to.** wit
d090: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
d0a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65  transaction (i.e
d0b0: 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  . if Pager.journ
d0c0: 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a  alOff==0)..**.**
d0d0: 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69   If doTruncate i
d0e0: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68  s non-zero or th
d0f0: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  e Pager.journalS
d100: 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c  izeLimit variabl
d110: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  e is.** set to 0
d120: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
d130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d140: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
d150: 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73  n size. Otherwis
d160: 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32  e,.** zero the 2
d170: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74  8-byte header at
d180: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
d190: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
d1a0: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
d1b0: 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72  .** if the pager
d1c0: 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79   is not in no-sy
d1d0: 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  nc mode, sync th
d1e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
d1f0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61  mmediately .** a
d200: 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20  fter writing or 
d210: 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a  truncating it..*
d220: 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f  *.** If Pager.jo
d230: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69  urnalSizeLimit i
d240: 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74  s set to a posit
d250: 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ive, non-zero va
d260: 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c  lue, and.** foll
d270: 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61  owing the trunca
d280: 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20  tion or zeroing 
d290: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
d2a0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
d2b0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d2c0: 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72   in bytes is lar
d2d0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ger than this va
d2e0: 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  lue, then trunca
d2f0: 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
d300: 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e  l file to Pager.
d310: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d320: 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72   bytes. The jour
d330: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  nal file does.**
d340: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
d350: 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
d360: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
d370: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
d380: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62  error occurs, ab
d390: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
d3a0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
d3b0: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  IO error code..*
d3c0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
d3d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
d3e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
d3f0: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
d400: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
d410: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
d420: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
d460: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
d470: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
d480: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
d490: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
d4a0: 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69     const i64 iLi
d4b0: 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  mit = pPager->jo
d4c0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
d4d0: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
d4e0: 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20  e of jsl */..   
d4f0: 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f   IOTRACE(("JZERO
d500: 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  HDR %p\n", pPage
d510: 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72  r)).    if( doTr
d520: 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74  uncate || iLimit
d530: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
d540: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
d550: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
d560: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
d570: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
d580: 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b  st char zeroHdr[
d590: 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20  28] = {0};.     
d5a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
d5b0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
d5c0: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
d5d0: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
d5e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
d5f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
d600: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d610: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d620: 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
d630: 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
d640: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61  YNC_DATAONLY|pPa
d650: 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
d660: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d670: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
d680: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
d690: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
d6a0: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
d6b0: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
d6c0: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
d6d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
d6e0: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
d6f0: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
d700: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
d710: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
d720: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
d730: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
d740: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
d750: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
d760: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
d770: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
d780: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
d790: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
d7a0: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
d7b0: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
d7c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d7d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d7e0: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
d7f0: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
d800: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d810: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
d820: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
d830: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d840: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
d850: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
d860: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
d870: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d880: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
d890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
d8a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d8b0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d8c0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
d8d0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
d8e0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
d8f0: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
d900: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
d910: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
d920: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
d930: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
d940: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
d950: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
d960: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
d970: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
d980: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
d990: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
d9a0: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
d9b0: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
d9c0: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
d9d0: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
d9e0: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
d9f0: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
da00: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
da10: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
da20: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
da30: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
da40: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
da50: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
da60: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
da70: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
da80: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
da90: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
daa0: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
dab0: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
dac0: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
dad0: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
dae0: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
daf0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
db00: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
db10: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
db20: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
db30: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
db40: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
db50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
db60: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
db70: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
db80: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
db90: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70   /* Temporary sp
dba0: 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ace used to buil
dbb0: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  d header */.  u3
dbc0: 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32  2 nHeader = (u32
dbd0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
dbe0: 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66  e;/* Size of buf
dbf0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
dc00: 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75  y zHeader */.  u
dc10: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68     /* Bytes of h
dc40: 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69  eader sector wri
dc50: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  tten */.  int ii
dc60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc80: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
dc90: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
dca0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
dcb0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
dcc0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
dcd0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20  open. */..  if( 
dce0: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
dcf0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
dd00: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
dd10: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
dd20: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
dd30: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
dd40: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
dd50: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
dd60: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20   were created . 
dd70: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   ** since the mo
dd80: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
dd90: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
dda0: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
ddb0: 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65   .  ** PagerSave
ddc0: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
ddd0: 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a   fields now..  *
dde0: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
ddf0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
de00: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
de10: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76  if( pPager->aSav
de20: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
de30: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
de40: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
de50: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
de60: 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
de70: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
de80: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
de90: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
dea0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
deb0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
dec0: 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  t(pPager);..  /*
ded0: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
dee0: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
def0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
df00: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
df10: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
df20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
df30: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
df40: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
df50: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
df60: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
df70: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
df80: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
df90: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
dfa0: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
dfb0: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
dfc0: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
dfd0: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
dfe0: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
dff0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
e000: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
e010: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
e020: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
e030: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
e040: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
e050: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
e060: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
e070: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
e080: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
e090: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
e0a0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
e0b0: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
e0c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
e0d0: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
e0e0: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
e0f0: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
e100: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
e110: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
e120: 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  urred whilst wri
e130: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
e140: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
e150: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
e160: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
e170: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
e180: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
e190: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
e1a0: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
e1b0: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e1c0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
e1d0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
e1e0: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
e1f0: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
e200: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
e210: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
e220: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
e230: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
e240: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e250: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
e260: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
e270: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
e280: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
e290: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
e2a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
e2b0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e2c0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
e2d0: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  d) || pPager->no
e2e0: 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50  Sync );.  if( pP
e2f0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
e300: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
e310: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
e320: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
e330: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
e340: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
e350: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
e360: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
e370: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
e380: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
e390: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
e3a0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
e3b0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
e3c0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e3d0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e3e0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
e3f0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
e400: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
e410: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
e420: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
e430: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
e440: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
e450: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
e460: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
e470: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
e480: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e490: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
e4a0: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
e4b0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e4c0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e4d0: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
e4e0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
e4f0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
e500: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
e510: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e520: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e530: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
e540: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
e550: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
e560: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
e570: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
e580: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e590: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e5a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
e5b0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
e5c0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
e5d0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
e5e0: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e5f0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e600: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
e610: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
e620: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
e630: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
e640: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
e650: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
e660: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
e670: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
e680: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
e690: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
e6a0: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
e6b0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
e6c0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
e6d0: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
e6e0: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
e6f0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
e700: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
e710: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
e720: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
e730: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e740: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
e750: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
e760: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e770: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
e780: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
e790: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
e7a0: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
e7b0: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
e7c0: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
e7d0: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
e7e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e7f0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
e800: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
e810: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
e820: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
e830: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
e840: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
e850: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
e860: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
e870: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
e880: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
e890: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
e8a0: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
e8b0: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
e8c0: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
e8d0: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
e8e0: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
e8f0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
e900: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
e910: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
e920: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
e930: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
e940: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
e950: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
e960: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
e970: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
e980: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
e990: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
e9a0: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
e9b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
e9c0: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
e9d0: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
e9e0: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
e9f0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
ea00: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
ea10: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
ea20: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
ea30: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
ea40: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
ea50: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
ea60: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
ea70: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
ea80: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
ea90: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
eaa0: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
eab0: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
eac0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ead0: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
eae0: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
eaf0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
eb00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
eb10: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
eb20: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
eb30: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
eb40: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
eb50: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
eb60: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
eb70: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
eb80: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
eb90: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
eba0: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
ebb0: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
ebc0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
ebd0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
ebe0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
ebf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
ec00: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ec10: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
ec20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ec30: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
ec40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
ec50: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
ec60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ec70: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
ec80: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
ec90: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
eca0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
ecb0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
ecc0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
ecd0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
ece0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
ecf0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
ed00: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
ed10: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
ed20: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
ed30: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
ed40: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
ed50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
ed60: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
ed70: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
ed80: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
ed90: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
eda0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
edb0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
edc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
edd0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
ede0: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
edf0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
ee00: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
ee10: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
ee20: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
ee30: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
ee40: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
ee50: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
ee60: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
ee70: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
ee80: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
ee90: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
eea0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
eeb0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
eec0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
eed0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
eee0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
eef0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
ef00: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
ef10: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
ef20: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
ef30: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
ef40: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
ef50: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
ef60: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
ef70: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
ef80: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
ef90: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
efa0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
efb0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
efc0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
efd0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
efe0: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
eff0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
f000: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
f010: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
f020: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
f030: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
f040: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
f050: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
f060: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
f070: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
f080: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0a0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
f0b0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
f0c0: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
f0d0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
f0e0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f0f0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
f100: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
f110: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
f120: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
f130: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f140: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
f150: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
f160: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
f170: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
f180: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
f190: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
f1c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
f1d0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
f1e0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f1f0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
f200: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
f210: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
f220: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
f230: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
f240: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
f250: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
f260: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
f270: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
f280: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
f290: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
f2a0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
f2b0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
f2c0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
f2d0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
f2e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
f2f0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
f300: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
f310: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
f320: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
f330: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
f340: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
f350: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f360: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
f370: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f380: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
f390: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
f3a0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
f3b0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
f3c0: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
f3d0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
f3e0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
f3f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
f400: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
f410: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
f420: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
f430: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f440: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
f450: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
f460: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
f470: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
f480: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
f490: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f4a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
f4b0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
f4c0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
f4d0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
f4e0: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
f4f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
f500: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f510: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
f520: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
f530: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f540: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
f550: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f560: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
f570: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
f580: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
f590: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
f5a0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
f5b0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
f5c0: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
f5d0: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
f5e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
f5f0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
f600: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
f610: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
f620: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
f630: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
f640: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
f650: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f660: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f670: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f680: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
f690: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f6a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f6b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f6c0: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
f6d0: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
f6e0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f6f0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f700: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f710: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
f720: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
f730: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
f740: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f750: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
f760: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
f770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f780: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
f790: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f7a0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
f7b0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
f7c0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
f7d0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
f7e0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  nal header */.. 
f7f0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
f800: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
f810: 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c  tor-size journal
f820: 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20   header fields. 
f830: 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  */.    if( SQLIT
f840: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
f850: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
f860: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20  fd, iHdrOff+20, 
f870: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20  &iSectorSize)). 
f880: 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
f890: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
f8a0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
f8b0: 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61  iHdrOff+24, &iPa
f8c0: 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a  geSize)).    ){.
f8d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f8e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
f8f0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
f900: 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
f910: 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73 69   set the page-si
f920: 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
f930: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68      ** journal h
f940: 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49  eader to zero. I
f950: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73 73  n this case, ass
f960: 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61 67  ume that the Pag
f970: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  er.pageSize.    
f980: 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  ** variable is a
f990: 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74 68  lready set to th
f9a0: 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20 73  e correct page s
f9b0: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
f9c0: 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30  if( iPageSize==0
f9d0: 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53   ){.      iPageS
f9e0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
f9f0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  geSize;.    }.. 
fa00: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
fa10: 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
fa20: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
fa30: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
fa40: 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
fa50: 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
fa60: 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
fa70: 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
fa80: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
fa90: 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
faa0: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
fab0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
fac0: 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
fad0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
fae0: 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
faf0: 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
fb00: 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
fb10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fb20: 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
fb50: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
fb60: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
fb70: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
fb80: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
fb90: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
fba0: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
fbb0: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
fbc0: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
fbd0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
fbe0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
fbf0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
fc00: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
fc10: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
fc20: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
fc30: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
fc40: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
fc50: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
fc60: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
fc70: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
fc80: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
fc90: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
fca0: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
fcb0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
fcc0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
fcd0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
fce0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
fcf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
fd00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
fd10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fd20: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
fd30: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
fd40: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
fd50: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
fd60: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
fd70: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
fd80: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
fd90: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
fda0: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
fdb0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
fdc0: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
fdd0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
fde0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
fdf0: 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61  ize(pPager, &iPa
fe00: 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20  geSize, -1);.   
fe10: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
fe20: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
fe30: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
fe40: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
fe50: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
fe60: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
fe70: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
fe80: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
fe90: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
fea0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
feb0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
fec0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
fed0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
fee0: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
fef0: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
ff00: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
ff10: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
ff20: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
ff30: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
ff40: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
ff50: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
ff60: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ff70: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
ff80: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
ff90: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
ffa0: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
ffb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ffc0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
ffd0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
ffe0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
fff0: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
10000 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
10010 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
10020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10030 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
10040 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
10050 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
10060 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10070 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
10080 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
10090 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
100a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
100b0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
100c0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
100d0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
100e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
100f0 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
10100 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
10110 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
10120 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
10130 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
10140 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
10150 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
10160 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
10170 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
10180 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
10190 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
101a0 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
101b0 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
101c0 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
101d0 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
101e0 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
101f0 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
10200 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
10210 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
10220 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
10230 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
10240 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
10250 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
10260 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
10270 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
10280 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
10290 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
102a0 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
102b0 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
102c0 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
102d0 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
102e0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
102f0 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
10300 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
10310 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
10320 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
10330 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
10340 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
10350 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
10360 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
10370 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
10380 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
103b0 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
103c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103d0 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
103e0 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
103f0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
10400 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
10410 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10420 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
10430 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
10440 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
10470 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
10480 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
10490 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
104a0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
104b0 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
104c0 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
104d0 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
104e0 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ster==0 );.  ass
104f0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
10500 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
10510 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20  if( !zMaster .  
10520 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
10530 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
10540 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
10550 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  Y .   || pPager-
10560 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10570 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10580 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  OFF .  ){.    re
10590 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
105a0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
105b0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
105c0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
105d0 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
105e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
105f0 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
10600 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10610 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   );..  /* Calcul
10620 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69  ate the length i
10630 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  n bytes and the 
10640 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73  checksum of zMas
10650 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61  ter */.  for(nMa
10660 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b  ster=0; zMaster[
10670 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65  nMaster]; nMaste
10680 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  r++){.    cksum 
10690 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  += zMaster[nMast
106a0 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er];.  }..  /* I
106b0 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
106c0 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
106d0 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
106e0 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
106f0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
10700 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
10710 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
10720 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
10730 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
10740 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10750 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10760 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
10770 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
10780 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
10790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
107a0 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
107b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
107c0 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
107d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
107e0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
107f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61  aster journal da
10800 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ta to the end of
10810 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10820 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72  e. If.  ** an er
10830 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
10840 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
10850 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
10860 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21  .  */.  if( (0 !
10870 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10880 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10890 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f   iHdrOff, PAGER_
108a0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
108b0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
108c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
108d0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
108e0 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65   zMaster, nMaste
108f0 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a  r, iHdrOff+4))).
10900 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10910 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
10920 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10930 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d  ff+4+nMaster, nM
10940 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28  aster))).   || (
10950 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10960 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10970 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10980 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29  aster+4, cksum))
10990 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
109a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
109b0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
109c0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
109d0 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
109e0 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
109f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10a00 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
10a10 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
10a20 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
10a30 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10a40 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
10a50 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
10a60 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
10a70 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
10a80 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
10a90 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
10aa0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
10ab0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
10ac0 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
10ad0 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
10ae0 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
10af0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
10b00 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
10b10 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
10b20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
10b30 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
10b40 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
10b50 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
10b60 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
10b70 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
10b80 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
10b90 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
10ba0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
10bb0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
10bc0 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
10bd0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
10be0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
10bf0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
10c00 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
10c10 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
10c20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
10c30 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
10c40 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
10c50 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
10c60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10c70 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
10c80 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
10c90 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10ca0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10cb0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
10cc0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
10cd0 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
10ce0 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
10cf0 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
10d00 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  er. Return.** a 
10d10 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
10d20 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  age or NULL if t
10d30 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
10d40 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72  e is not .** alr
10d50 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  eady in memory..
10d60 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
10d70 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
10d80 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
10d90 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
10da0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10dc0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
10dd0 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
10de0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63  possible for a c
10df0 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74  all to PcacheFet
10e00 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65  ch() with create
10e10 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20  Flag==0 to.  ** 
10e20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61  fail, since no a
10e30 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
10e40 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  te dynamic memor
10e50 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a  y will be made..
10e60 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c    */.  (void)sql
10e70 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
10e80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
10e90 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
10ea0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
10eb0 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20  .** Discard the 
10ec0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
10ed0 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
10ee0 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a   page-cache..*/.
10ef0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
10f00 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
10f10 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
10f20 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
10f30 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
10f40 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
10f50 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
10f60 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
10f70 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
10f80 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
10f90 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
10fa0 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
10fb0 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
10fc0 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
10fd0 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
10fe0 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
10ff0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
11000 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
11010 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
11020 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11030 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11040 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
11050 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
11060 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11080 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
11090 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
110a0 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
110b0 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
110c0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
110d0 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
110e0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
110f0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
11100 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
11110 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
11120 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
11130 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
11140 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
11150 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
11160 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11170 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11180 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11190 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
111a0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
111b0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
111c0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
111d0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
111e0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
111f0 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
11200 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
11210 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
11220 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
11230 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
11240 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11250 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11260 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11270 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11280 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11290 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
112a0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
112b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
112c0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
112d0 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
112e0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
112f0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
11300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11310 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11320 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11330 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
11340 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11350 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11360 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11370 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11380 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11390 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
113a0 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
113b0 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
113c0 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
113d0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
113e0 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
113f0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
11400 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11410 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11420 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11430 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11440 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11450 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11470 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11480 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11490 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
114a0 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
114b0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
114c0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
114d0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
114e0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
114f0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
11500 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11510 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11520 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
11530 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
11540 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11550 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11560 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11570 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11580 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11590 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
115a0 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
115b0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
115c0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
115d0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
115e0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
115f0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
11600 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
11610 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
11620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11630 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
11640 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11650 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11660 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11670 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11680 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11690 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
116a0 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
116b0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
116c0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
116d0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
116e0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
116f0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11700 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
11710 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
11720 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
11730 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
11740 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11750 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11760 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11770 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11780 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11790 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
117a0 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
117b0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
117c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
117d0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
117e0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
117f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11800 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11810 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11820 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11830 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11840 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11850 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
11860 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
11870 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
11880 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
11890 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
118a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
118b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
118c0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
118d0 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
118e0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
118f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11900 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
11910 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11920 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
11930 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11940 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
11950 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
11960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11970 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
11980 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
11990 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
119a0 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
119b0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
119c0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
119d0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
119e0 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
119f0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
11a00 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
11a10 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
11a20 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
11a30 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
11a40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11a50 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
11a60 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
11a70 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
11a80 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
11a90 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
11aa0 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
11ab0 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
11ac0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
11ad0 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
11ae0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11af0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11b00 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
11b10 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11b20 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11b30 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
11b40 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11b50 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11b60 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
11b70 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
11b80 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11b90 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
11ba0 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
11bb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11bc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11bd0 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
11be0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11bf0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11c00 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
11c10 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
11c20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
11c30 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
11c40 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
11c50 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
11c60 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
11c70 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
11c80 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11c90 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
11ca0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
11cb0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
11cc0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
11cd0 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
11ce0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
11cf0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
11d00 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
11d10 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
11d20 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
11d30 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
11d40 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
11d50 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
11d60 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
11d70 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
11d80 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
11d90 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
11da0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
11db0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
11dc0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
11dd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
11de0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
11df0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
11e00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
11e10 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
11e20 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
11e30 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
11e40 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
11e50 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
11e60 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
11e70 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
11e80 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
11e90 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
11ea0 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
11eb0 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
11ec0 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
11ed0 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
11ee0 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
11ef0 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
11f00 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11f10 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
11f20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
11f30 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
11f40 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
11f50 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
11f60 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
11f70 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
11f80 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
11f90 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
11fa0 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
11fb0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
11fc0 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
11fd0 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
11fe0 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
11ff0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
12000 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
12010 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
12020 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
12030 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
12040 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12050 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12060 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12070 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12080 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12090 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
120a0 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ode ){.    asser
120b0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
120c0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
120d0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
120e0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
120f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
12100 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72  File;.    pPager
12110 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
12120 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65  _OPEN;.    pPage
12130 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
12140 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
12150 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12160 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
12170 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
12180 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
12190 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
121a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
121b0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
121c0 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
121d0 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
121e0 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
121f0 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
12200 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
12210 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
12220 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
12230 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
12240 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
12250 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
12260 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
12270 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
12280 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
12290 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
122a0 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
122b0 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
122c0 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
122d0 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
122e0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
122f0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
12300 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
12310 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
12320 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
12330 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
12340 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
12350 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
12360 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
12370 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
12380 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
12390 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
123a0 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
123b0 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
123c0 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
123d0 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
123e0 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
123f0 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
12400 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
12410 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
12420 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
12430 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
12440 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
12450 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12460 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
12470 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
12480 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
12490 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
124a0 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
124b0 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
124c0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
124d0 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
124e0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
124f0 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
12500 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
12510 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
12520 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
12530 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
12540 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
12550 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
12560 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
12570 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
12580 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
12590 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
125a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
125b0 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
125c0 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
125d0 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
125e0 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
125f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12600 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
12610 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
12620 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12630 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
12640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
12650 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
12660 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
12670 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
12680 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
12690 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
126a0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
126b0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
126c0 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
126d0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
126e0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
126f0 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
12700 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12720 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12730 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12740 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12750 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12760 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12770 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12780 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12790 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
127a0 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
127b0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
127c0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
127d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
127e0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
127f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12800 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12810 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12820 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12830 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12840 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12850 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12860 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12870 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12880 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12890 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
128a0 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
128b0 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
128c0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
128d0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
128e0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
128f0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12900 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12910 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12920 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12930 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12940 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12950 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12960 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12970 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12980 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12990 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
129a0 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
129b0 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
129c0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
129d0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
129e0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
129f0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12a00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12a10 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12a20 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12a30 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12a40 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12a50 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12a60 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12a70 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12a80 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12a90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12aa0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12ab0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ac0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12ad0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ae0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12af0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12b00 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12b10 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12b20 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12b30 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12b40 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12b50 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12b60 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12b70 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12b80 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12b90 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12ba0 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12bb0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12bc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12bd0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12be0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12bf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12c00 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
12c10 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
12c20 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
12c30 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
12c40 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
12c50 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
12c60 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
12c70 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
12c80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
12c90 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
12ca0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
12cb0 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
12cc0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
12cd0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
12ce0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
12cf0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
12d00 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
12d10 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
12d20 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
12d30 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
12d40 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
12d50 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
12d60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
12d70 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
12d80 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
12d90 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
12da0 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
12db0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
12dc0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
12dd0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
12de0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
12df0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
12e00 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
12e10 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
12e20 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
12e30 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
12e40 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
12e50 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
12e60 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
12e70 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
12e80 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
12e90 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
12ea0 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
12eb0 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
12ec0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
12ed0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
12ee0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
12ef0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
12f00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12f10 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
12f20 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
12f30 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
12f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
12f50 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
12f60 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
12f70 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
12f80 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
12f90 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
12fa0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
12fb0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
12fc0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
12fd0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
12fe0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
12ff0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
13000 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
13010 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13020 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13030 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13040 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13050 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13060 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13070 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13080 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13090 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
130a0 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
130b0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
130c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
130d0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
130e0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
130f0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
13100 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
13110 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
13120 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13130 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
13140 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
13150 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
13160 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
13170 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
13180 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
13190 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
131a0 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
131b0 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
131c0 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
131d0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
131e0 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
131f0 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
13200 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
13210 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
13220 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
13230 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
13240 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
13250 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
13260 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
13270 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
13280 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
13290 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
132a0 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
132b0 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
132c0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
132d0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
132e0 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
132f0 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
13300 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
13310 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
13320 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
13330 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
13340 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13350 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
13360 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
13370 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
13380 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
13390 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
133a0 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
133b0 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
133c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
133d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
133e0 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
133f0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
13400 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
13410 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13420 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
13430 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
13440 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
13450 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
13460 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
13470 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
13480 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
13490 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
134a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
134b0 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
134c0 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
134d0 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
134e0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
134f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13500 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
13510 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
13520 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
13530 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
13540 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
13550 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
13560 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
13570 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
13580 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
13590 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
135a0 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
135b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
135c0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  e. */.    if( sq
135d0 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
135e0 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  l(pPager->jfd) )
135f0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13600 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13610 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13620 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
13630 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13640 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13650 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
13660 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13670 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
13680 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
13690 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
136a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
136b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
136c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
136d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
136e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
136f0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
13700 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
13710 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
13720 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13730 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
13740 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13750 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13760 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
13770 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
13780 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
13790 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
137a0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
137b0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20  URNALMODE_WAL). 
137c0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
137d0 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
137e0 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
137f0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  r);.      pPager
13800 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13810 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13820 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
13830 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  h may be execute
13840 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75  d with Pager.jou
13850 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
13860 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68   if.      ** a h
13870 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a  ot-journal was j
13880 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ust rolled back.
13890 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
138a0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
138b0 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  ** file should b
138c0 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  e closed and del
138d0 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f  eted. If this co
138e0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
138f0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
13900 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
13910 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69  t will do so usi
13920 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ng an in-memory 
13930 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20  journal. .      
13940 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
13950 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13960 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
13970 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a  NALMODE_DELETE .
13980 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
13990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
139a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
139b0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
139c0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
139d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
139e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
139f0 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
13a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
13a10 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
13a20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
13a30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
13a40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13a50 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
13a60 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
13a70 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
13a80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
13a90 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
13aa0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
13ab0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
13ac0 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
13ad0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
13ae0 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
13af0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
13b00 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
13b10 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
13b20 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
13b30 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
13b40 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f  dr *p = pager_lo
13b50 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b  okup(pPager, 1);
13b60 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
13b70 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20      p->pageHash 
13b80 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
13b90 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29 3b  e3PagerUnref(p);
13ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
13bb0 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  f..  sqlite3Bitv
13bc0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
13bd0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
13be0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
13bf0 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  nal = 0;.  pPage
13c00 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73  r->nRec = 0;.  s
13c10 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
13c20 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
13c30 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
13c40 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
13c50 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
13c60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
13c70 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
13c80 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
13c90 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
13ca0 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
13cb0 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
13cc0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
13cd0 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
13ce0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
13cf0 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
13d00 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
13d10 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
13d20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
13d30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13d40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
13d50 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
13d60 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
13d70 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
13d80 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
13d90 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
13da0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  );.  }.  if( !pP
13db0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
13dc0 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
13dd0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13de0 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
13df0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
13e00 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
13e10 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
13e20 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
13e30 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
13e40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
13e50 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
13e60 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
13e70 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
13e80 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
13e90 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
13ea0 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
13eb0 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
13ec0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
13ed0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
13ee0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
13ef0 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
13f00 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
13f10 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
13f20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
13f30 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
13f40 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
13f50 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
13f60 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
13f70 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
13f80 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
13f90 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
13fa0 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
13fb0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
13fc0 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
13fd0 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
13fe0 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
13ff0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14000 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
14010 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
14020 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
14030 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
14040 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
14050 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
14060 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
14070 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
14080 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
14090 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
140a0 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
140b0 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
140c0 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
140d0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
140e0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
140f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
14100 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14110 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
14120 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
14130 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14140 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14150 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
14160 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
14170 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14180 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14190 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
141a0 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
141b0 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
141c0 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
141d0 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
141e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
141f0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
14200 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
14210 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14220 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14230 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
14240 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
14250 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
14260 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
14270 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
14280 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14290 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
142a0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
142b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
142c0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
142d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
142e0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
142f0 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14300 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14310 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
14320 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
14330 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
14340 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14350 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
14360 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
14370 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
14380 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
14390 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
143a0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
143b0 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ger);.}../*.** P
143c0 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
143d0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
143e0 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
143f0 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
14400 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
14410 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
14420 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
14430 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
14440 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
14450 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
14460 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14470 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
14480 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
14490 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
144a0 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
144b0 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
144c0 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
144d0 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
144e0 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
144f0 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
14500 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
14510 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
14520 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
14530 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
14540 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
14550 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
14560 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14570 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
14580 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
14590 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
145a0 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
145b0 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
145c0 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
145d0 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
145e0 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
145f0 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
14600 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
14610 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
14620 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
14630 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
14640 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
14650 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
14660 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
14670 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
14680 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
14690 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
146a0 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
146b0 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
146c0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
146d0 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
146e0 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
146f0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
14700 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
14710 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
14720 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
14730 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
14740 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
14750 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
14760 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
14770 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
14780 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
14790 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
147a0 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
147b0 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
147c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
147d0 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
147e0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
147f0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
14800 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
14810 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14820 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
14830 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
14840 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
14850 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
14860 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
14870 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
14880 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
14890 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
148a0 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
148b0 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
148c0 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
148d0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
148e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
148f0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
14900 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14910 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
14920 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
14930 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14940 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
14950 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
14960 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
14970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14980 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
14990 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
149a0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
149b0 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
149c0 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
149d0 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
149e0 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
149f0 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
14a00 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
14a10 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
14a20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14a30 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
14a40 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
14a50 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
14a60 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
14a70 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
14a80 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
14a90 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
14aa0 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
14ab0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
14ac0 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
14ad0 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
14ae0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
14af0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
14b00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
14b10 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
14b20 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
14b30 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
14b40 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
14b50 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
14b60 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
14b70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
14b80 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
14b90 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
14ba0 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
14bb0 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
14bc0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
14bd0 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
14be0 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
14bf0 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
14c00 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
14c10 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
14c20 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
14c30 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
14c40 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
14c50 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
14c60 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
14c70 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
14c80 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
14c90 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
14ca0 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
14cb0 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
14cc0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
14cd0 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
14ce0 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
14cf0 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
14d00 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
14d10 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
14d20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
14d30 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
14d40 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
14d50 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
14d60 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
14d70 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
14d80 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
14d90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
14da0 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
14db0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
14dc0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
14dd0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
14de0 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
14df0 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
14e00 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14e10 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
14e20 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
14e30 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14e40 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
14e50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
14e60 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
14e70 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
14e80 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
14e90 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
14ea0 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
14eb0 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
14ec0 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
14ed0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
14ee0 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
14ef0 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
14f00 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
14f10 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
14f20 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
14f30 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
14f40 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
14f50 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
14f60 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
14f70 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
14f80 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14f90 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
14fa0 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
14fb0 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
14fc0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
14fd0 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
14fe0 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
14ff0 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
15000 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
15010 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
15020 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
15030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
15040 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
15050 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
15060 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
15070 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
15080 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
15090 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
150a0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
150b0 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
150c0 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
150d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
150e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
150f0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
15100 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
15110 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15130 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
15140 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
15150 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
15160 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15170 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
15180 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
15190 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
151a0 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
151b0 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
151c0 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
151d0 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
151e0 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15200 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
15210 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
15220 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
15230 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
15240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15250 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
15260 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
15270 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
15280 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
15290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
152a0 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
152b0 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
152c0 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
152e0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
152f0 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
15300 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
15310 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
15320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
15330 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
15340 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
15350 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15370 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
15380 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
15390 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
153a0 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
153b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
153c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
153d0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
153e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
153f0 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
15400 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15410 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
15420 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
15430 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
15440 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
15450 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
15460 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15470 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
15480 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
15490 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
154a0 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
154b0 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
154c0 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
154d0 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
154e0 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
154f0 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
15500 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
15510 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
15520 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
15530 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
15540 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
15550 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15560 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
15570 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
15580 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
15590 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
155a0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
155b0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
155c0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
155d0 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
155e0 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
155f0 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
15600 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
15610 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
15620 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15630 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
15640 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
15650 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
15660 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
15670 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
15680 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
15690 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
156a0 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
156b0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
156c0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
156d0 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
156e0 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
156f0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
15700 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
15710 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
15720 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
15730 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
15740 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
15750 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
15760 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15770 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15780 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
15790 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
157a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
157b0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
157c0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
157d0 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
157e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
157f0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15800 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
15810 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
15820 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
15830 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
15840 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
15850 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
15860 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
15870 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15880 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
15890 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
158a0 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
158b0 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
158c0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
158d0 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
158e0 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
158f0 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
15900 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
15910 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15920 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
15930 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
15940 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
15950 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
15960 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
15970 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15980 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
15990 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
159a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
159b0 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
159c0 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
159d0 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
159e0 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
159f0 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
15a00 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
15a10 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
15a20 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
15a30 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
15a40 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
15a50 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
15a60 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
15a70 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
15a80 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
15a90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
15aa0 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
15ab0 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
15ac0 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
15ad0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
15ae0 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
15af0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
15b00 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
15b10 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
15b20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
15b30 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
15b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
15b50 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
15b60 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
15b70 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
15b80 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
15b90 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
15ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15bb0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
15bc0 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
15bd0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
15be0 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
15bf0 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
15c00 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
15c10 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
15c20 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
15c30 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
15c40 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
15c50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15c60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
15c70 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
15c80 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
15c90 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
15ca0 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72  ed by before dur
15cb0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
15cc0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
15cd0 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
15ce0 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
15cf0 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
15d00 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
15d10 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
15d20 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
15d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15d40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15d50 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
15d60 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
15d70 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
15d80 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
15d90 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
15da0 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
15db0 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
15dc0 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
15dd0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
15de0 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
15df0 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
15e00 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
15e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
15e20 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
15e30 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
15e40 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
15e50 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
15e60 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
15e70 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
15e80 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
15e90 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
15ea0 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
15eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15ec0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
15ed0 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
15ee0 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
15ef0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
15f00 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
15f10 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
15f20 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
15f30 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
15f40 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
15f50 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
15f60 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
15f70 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
15f80 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
15f90 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
15fa0 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
15fb0 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
15fc0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
15fd0 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
15fe0 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
15ff0 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16000 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16010 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16020 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
16030 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
16040 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
16050 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
16060 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
16070 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
16080 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16090 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
160a0 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
160b0 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
160c0 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
160d0 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
160e0 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
160f0 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16100 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16110 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16120 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
16130 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
16140 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
16150 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
16160 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
16170 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
16180 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16190 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
161a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
161b0 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
161c0 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
161d0 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
161e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
161f0 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16200 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16210 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16220 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
16230 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
16240 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
16250 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
16260 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
16270 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
16280 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16290 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
162a0 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
162b0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
162c0 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
162d0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
162e0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
162f0 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16300 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16310 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16320 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
16330 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
16340 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
16350 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
16360 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
16370 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
16380 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16390 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
163a0 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
163b0 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
163c0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
163d0 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
163e0 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
163f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16400 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16410 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16420 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16430 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16440 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16450 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16460 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16480 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16490 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
164a0 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
164b0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
164c0 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
164d0 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
164e0 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
164f0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16500 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16510 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16520 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16530 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16540 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16550 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16560 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16570 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
16580 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
16590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
165a0 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
165b0 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
165c0 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
165d0 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
165e0 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
165f0 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
16600 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
16610 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
16620 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
16630 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16640 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16650 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
16660 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16670 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
16680 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
16690 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
166a0 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
166b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
166c0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
166d0 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20  _OPEN || pPg==0 
166e0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
166f0 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
16700 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16710 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
16720 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
16730 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
16740 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
16750 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
16760 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
16770 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
16780 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
16790 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
167a0 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
167b0 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
167c0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
167d0 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
167e0 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
167f0 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
16800 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
16810 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
16820 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
16830 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
16840 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
16850 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
16860 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
16870 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16880 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
16890 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
168a0 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
168b0 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
168c0 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
168d0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
168e0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
168f0 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
16900 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
16910 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
16920 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
16930 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
16940 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16950 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
16960 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
16970 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29  Pager->fd, (u8*)
16980 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
16990 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
169a0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
169b0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
169c0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
169d0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
169e0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  no;.    }.    if
169f0 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  ( pPager->pBacku
16a00 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43  p ){.      CODEC
16a10 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  1(pPager, aData,
16a20 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c   pgno, 3, rc=SQL
16a30 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
16a40 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
16a50 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
16a60 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
16a70 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  *)aData);.      
16a80 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 61  CODEC2(pPager, a
16a90 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72  Data, pgno, 7, r
16aa0 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  c=SQLITE_NOMEM, 
16ab0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
16ac0 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69  }else if( !isMai
16ad0 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20  nJrnl && pPg==0 
16ae0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
16af0 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
16b00 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61  of a savepoint a
16b10 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20  nd data was not 
16b20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a  written to.    *
16b30 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
16b40 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
16b50 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68  ot in-memory, th
16b60 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69  ere is a potenti
16b70 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65  al.    ** proble
16b80 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65  m. When the page
16b90 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64   is next fetched
16ba0 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
16bb0 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a  ayer, it .    **
16bc0 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
16bd0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
16be0 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20  file, which may 
16bf0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20  or may not be . 
16c00 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a     ** current. .
16c10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
16c20 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65  ere are a couple
16c30 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61   of different wa
16c40 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  ys this can happ
16c50 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74  en. All are quit
16c60 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65  e.    ** obscure
16c70 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  . When running i
16c80 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  n synchronous mo
16c90 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c  de, this can onl
16ca0 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a  y happen .    **
16cb0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
16cc0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
16cd0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
16ce0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16cf0 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f  , then.    ** po
16d00 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f  pulated, then mo
16d10 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ved using sqlite
16d20 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
16d30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16d40 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
16d50 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d  to add an in-mem
16d60 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20  ory page to the 
16d70 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cache containing
16d80 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
16d90 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
16da0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
16db0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
16dc0 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20  s dirty .    ** 
16dd0 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72  and if the pager
16de0 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72   requires a jour
16df0 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d  nal-sync, then m
16e00 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16e10 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e  .    ** requirin
16e20 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  g a journal-sync
16e30 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72   before it is wr
16e40 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
16e50 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65    assert( isSave
16e60 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pnt );.    asser
16e70 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
16e80 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  Spill==0 );.    
16e90 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
16ea0 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll++;.    rc = s
16eb0 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
16ec0 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
16ed0 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
16ee0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
16ef0 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a  oNotSpill==1 );.
16f00 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
16f10 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66  tSpill--;.    if
16f20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16f30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
16f40 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
16f50 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
16f60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
16f70 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
16f80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
16f90 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
16fa0 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
16fb0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
16fc0 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
16fd0 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
16fe0 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
16ff0 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
17000 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
17010 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
17020 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
17030 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
17040 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
17050 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
17060 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
17070 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
17080 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
17090 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
170a0 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
170b0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
170c0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
170d0 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
170e0 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
170f0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
17100 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
17110 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
17120 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17130 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
17140 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
17150 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  if( isMainJrnl &
17160 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c  & (!isSavepnt ||
17170 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65   *pOffset<=pPage
17180 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29  r->journalHdr) )
17190 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
171a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
171b0 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75 73  is page were jus
171c0 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20  t restored from 
171d0 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20  the main .      
171e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
171f0 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e   then its conten
17200 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68 65  t must be as the
17210 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65 20  y were when the 
17220 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
17230 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20  ction was first 
17240 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  opened. In this 
17250 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b  case we can mark
17260 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
17270 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e  ** as clean, sin
17280 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65  ce there will be
17290 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74   no need to writ
172a0 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a  e it out to the.
172b0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
172c0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
172d0 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    ** There is on
172e0 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  e exception to t
172f0 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65  his rule. If the
17300 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
17310 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  olled.      ** b
17320 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61  ack as part of a
17330 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73   savepoint (or s
17340 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61  tatement) rollba
17350 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20  ck from an .    
17360 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f    ** unsynced po
17370 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69  rtion of the mai
17380 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  n journal file, 
17390 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73  then it is not s
173a0 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  afe.      ** to 
173b0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
173c0 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20   clean. This is 
173d0 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20  because marking 
173e0 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20 20  the page as.    
173f0 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20    ** clean will 
17400 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f  clear the PGHDR_
17410 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20  NEED_SYNC flag. 
17420 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20 69  Since the page i
17430 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  s.      ** alrea
17440 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
17450 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64  l file (recorded
17460 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
17470 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20  rnal) and.      
17480 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17490 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63  D_SYNC flag is c
174a0 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20 70  leared, if the p
174b0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 74  age is written t
174c0 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  o.      ** again
174d0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
174e0 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c  nsaction, it wil
174f0 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  l be marked as d
17500 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a  irty but.      *
17510 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  * the PGHDR_NEED
17520 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20  _SYNC flag will 
17530 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20 63  not be set. It c
17540 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74  ould then potent
17550 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62  ially.      ** b
17560 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e  e written out in
17570 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
17580 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20  file before its 
17590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20  journal file.   
175a0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
175b0 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72   synced. If a cr
175c0 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ash occurs durin
175d0 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  g or following t
175e0 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61  his,.      ** da
175f0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17600 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20  n may ensue..   
17610 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
17620 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
17630 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
17640 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
17650 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
17660 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
17670 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
17680 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
17690 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
176a0 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
176b0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
176c0 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
176d0 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
176e0 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
176f0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
17700 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
17710 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
17720 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
17730 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
17740 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
17750 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
17760 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
17770 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
17780 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
17790 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
177a0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
177b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
177c0 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  M);.    sqlite3P
177d0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
177e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
177f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
17800 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
17810 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
17820 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
17830 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
17840 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
17850 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
17860 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
17870 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
17880 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
17890 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
178a0 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
178b0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
178c0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
178d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
178e0 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
178f0 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
17900 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
17910 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
17920 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
17930 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
17940 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
17950 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
17960 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
17970 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65  .** When a maste
17980 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
17990 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73  s created, it is
179a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
179b0 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66  the names .** of
179c0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
179d0 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20  d journals, one 
179e0 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66  after another, f
179f0 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d  ormatted as utf-
17a00 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65  8 .** encoded te
17a10 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65  xt. The end of e
17a20 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  ach child journa
17a30 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64  l file is marked
17a40 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d   with a .** nul-
17a50 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
17a60 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65  (0x00). i.e. the
17a70 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
17a80 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
17a90 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  rnal.** file for
17aa0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
17ab0 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74  nvolving two dat
17ac0 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a  abases might be:
17ad0 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f  .**.**   "/home/
17ae0 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61  bill/a.db-journa
17af0 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  l\x00/home/bill/
17b00 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  b.db-journal\x00
17b10 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72  ".**.** A master
17b20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
17b30 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65  y only be delete
17b40 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74  d once all of it
17b50 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72  s child .** jour
17b60 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72  nals have been r
17b70 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
17b80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17b90 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e  reads the conten
17ba0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
17bb0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e  -journal file in
17bc0 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  to .** memory an
17bd0 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  d loops through 
17be0 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c  each of the chil
17bf0 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e  d journal names.
17c00 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69   For.** each chi
17c10 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63  ld journal, it c
17c20 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  hecks if:.**.** 
17c30 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
17c40 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c   journal exists,
17c50 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20   and if so.**   
17c60 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
17c70 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
17c80 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d  a reference to m
17c90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a  aster journal .*
17ca0 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74  *     file zMast
17cb0 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68  er.**.** If a ch
17cc0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
17cd0 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61  be found that ma
17ce0 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68  tches both of th
17cf0 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62  e criteria.** ab
17d00 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ove, this functi
17d10 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  on returns witho
17d20 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
17d30 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  g. Otherwise, if
17d40 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c  .** no such chil
17d50 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
17d60 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61   found, file zMa
17d70 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64 20  ster is deleted 
17d80 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65  from.** the file
17d90 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71  -system using sq
17da0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
17db0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
17dc0 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69  error within thi
17dd0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65  s function, an e
17de0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
17df0 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66  urned. This.** f
17e00 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
17e10 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c  s memory by call
17e20 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ing sqlite3Mallo
17e30 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63  c(). If an alloc
17e40 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20  ation.** fails, 
17e50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
17e60 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
17e70 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72  ise, if no IO or
17e80 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a   malloc errors .
17e90 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45  ** occur, SQLITE
17ea0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
17eb0 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69  .**.** TODO: Thi
17ec0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  s function alloc
17ed0 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c  ates a single bl
17ee0 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
17ef0 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74   load.** the ent
17f00 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
17f10 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17f20 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
17f30 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70  uld be.** a coup
17f40 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20  le of kilobytes 
17f50 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61  or so - potentia
17f60 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  lly larger than 
17f70 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a  the page .** siz
17f80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17f90 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
17fa0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17fb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
17fc0 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
17fd0 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
17fe0 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
17ff0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18000 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
18010 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
18020 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
18030 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20      /* Malloc'd 
18040 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18050 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
18060 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18070 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a   *pJournal;   /*
18080 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d   Malloc'd child-
18090 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
180a0 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61  criptor */.  cha
180b0 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
180c0 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
180d0 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
180e0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
180f0 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
18100 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
18110 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
18120 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
18130 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
18140 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
18150 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c  r to one journal
18160 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20   within MJ file 
18170 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
18180 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f  erPtr;         /
18190 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
181a0 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d  MJ filename from
181b0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
181c0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  */.  int nMaster
181d0 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Ptr;           /
181e0 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  * Amount of spac
181f0 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a  e allocated to z
18200 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a  MasterPtr[] */..
18210 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
18220 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65  ace for both the
18230 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d   pJournal and pM
18240 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72  aster file descr
18250 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20  iptors..  ** If 
18260 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e  successful, open
18270 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18280 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61  nal file for rea
18290 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ding..  */.  pMa
182a0 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
182b0 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
182c0 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73  llocZero(pVfs->s
182d0 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20  zOsFile * 2);.  
182e0 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69  pJournal = (sqli
182f0 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38  te3_file *)(((u8
18300 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56   *)pMaster) + pV
18310 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
18320 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b   if( !pMaster ){
18330 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18340 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
18350 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
18360 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
18370 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
18380 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
18390 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
183a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
183b0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
183c0 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
183d0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
183e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
183f0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
18400 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
18410 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
18420 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
18430 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
18440 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
18450 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
18460 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
18470 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
18480 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
18490 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
184a0 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
184b0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
184c0 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
184d0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
184e0 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
184f0 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
18500 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
18510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
18520 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
18530 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
18540 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
18550 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
18560 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
18570 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
18580 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
18590 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
185a0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
185b0 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
185c0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
185d0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
185e0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
185f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
18600 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
18610 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18620 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
18630 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
18640 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
18650 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
18660 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
18670 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
18680 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
18690 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
186a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
186b0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
186c0 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
186d0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
186e0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
186f0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
18700 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
18710 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
18720 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
18730 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
18740 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
18750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18760 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
18770 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
18780 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
18790 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
187a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
187b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
187c0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
187d0 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
187e0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
187f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
18800 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
18810 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18820 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
18830 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
18840 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
18850 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
18860 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
18870 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
18880 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
18890 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
188a0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
188b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
188c0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
188d0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
188e0 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
188f0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
18900 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
18910 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
18920 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
18930 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
18940 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18960 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18970 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
18980 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
18990 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
189a0 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
189b0 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
189c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
189d0 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
189e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
189f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18a00 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18a10 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
18a20 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
18a30 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
18a40 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
18a50 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
18a60 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
18a70 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
18a80 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
18a90 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
18aa0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
18ab0 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
18ac0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ae0 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
18af0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18b00 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
18b10 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
18b20 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
18b30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
18b40 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
18b50 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
18b60 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
18b70 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
18b80 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
18b90 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
18ba0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
18bb0 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
18bc0 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
18bd0 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
18be0 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
18bf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
18c00 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
18c10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
18c20 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
18c30 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
18c40 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
18c50 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
18c60 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
18c70 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
18c80 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
18c90 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
18ca0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
18cb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
18cc0 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
18cd0 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
18ce0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
18cf0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
18d00 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
18d10 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
18d20 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
18d30 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
18d40 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
18d50 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
18d60 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
18d70 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
18d80 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
18d90 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
18da0 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
18db0 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
18dc0 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
18dd0 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
18de0 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
18df0 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
18e00 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
18e10 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
18e20 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
18e30 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
18e40 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
18e50 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
18e60 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
18e70 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
18e80 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
18e90 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
18ea0 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
18eb0 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
18ec0 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
18ed0 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
18ee0 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
18ef0 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
18f00 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
18f10 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
18f20 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
18f30 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
18f40 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
18f50 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
18f60 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
18f70 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
18f80 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
18f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
18fa0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
18fb0 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
18fc0 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
18fd0 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
18fe0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
18ff0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
19000 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19010 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
19020 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
19030 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
19040 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19060 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
19070 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
19080 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
19090 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  !=PAGER_READER )
190a0 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65  ;.  .  if( isOpe
190b0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20  n(pPager->fd) . 
190c0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53    && (pPager->eS
190d0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
190e0 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67  ER_DBMOD || pPag
190f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
19100 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20  R_OPEN) .  ){.  
19110 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
19120 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
19130 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19140 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19150 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
19160 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
19170 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
19180 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
19190 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
191a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
191b0 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
191c0 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
191d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
191e0 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
191f0 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
19200 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
19210 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
19220 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
19230 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
19240 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
19250 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
19260 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
19270 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
19280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
19290 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
192a0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
192b0 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
192c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
192d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
192e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
192f0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
19300 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
19310 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19330 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Set the value o
19340 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74  f the Pager.sect
19350 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
19360 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
19370 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20   pager based on 
19380 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
19390 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
193a0 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20  rSize method.** 
193b0 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  of the open data
193c0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73  base file. The s
193d0 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20  ector size will 
193e0 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a  be used used .**
193f0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
19400 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
19410 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
19420 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
19430 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
19440 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
19450 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
19460 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
19470 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
19480 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19490 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
194a0 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
194b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
194c0 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
194d0 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
194e0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
194f0 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
19500 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
19510 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
19520 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
19530 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
19540 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
19550 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
19560 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
19570 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
19580 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
19590 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
195a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
195b0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
195c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
195d0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
195e0 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
195f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
19600 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
19610 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
19620 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
19630 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
19640 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
19650 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
19660 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
19670 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
19680 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
19690 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
196a0 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
196b0 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
196c0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  t..    */.    pP
196d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
196e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
196f0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  orSize(pPager->f
19700 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  d);.  }.  if( pP
19710 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
19720 3c 33 32 20 29 7b 0a 20 20 20 20 70 50 61 67 65  <32 ){.    pPage
19730 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
19740 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  512;.  }.  if( p
19750 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
19760 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
19770 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  E ){.    assert(
19780 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
19790 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 70 50 61  >=512 );.    pPa
197a0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
197b0 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
197c0 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
197d0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
197e0 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
197f0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
19800 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
19810 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
19820 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
19830 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
19840 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
19850 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
19860 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
19870 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
19880 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
19890 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
198a0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
198b0 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
198c0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
198d0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
198e0 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
198f0 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
19900 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
19910 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
19920 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
19930 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
19940 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
19950 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
19960 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
19970 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
19980 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
19990 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
199a0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
199b0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
199c0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
199d0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
199e0 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
199f0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
19a00 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
19a10 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
19a20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
19a30 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
19a40 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
19a50 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
19a60 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
19a70 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
19a80 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
19a90 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
19aa0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
19ab0 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
19ac0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
19ad0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
19ae0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
19af0 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
19b00 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
19b10 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
19b20 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
19b30 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
19b40 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
19b50 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
19b60 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
19b70 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
19b80 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
19b90 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
19ba0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
19bb0 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
19bc0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
19bd0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
19be0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
19bf0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
19c00 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
19c10 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
19c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
19c30 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
19c40 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
19c50 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
19c60 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
19c70 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
19c80 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
19c90 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
19ca0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
19cb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
19cc0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
19cd0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
19ce0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
19cf0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
19d00 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
19d10 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
19d20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
19d30 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
19d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
19d50 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
19d60 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
19d70 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
19d80 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
19d90 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
19da0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
19db0 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
19dc0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
19dd0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
19de0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
19df0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
19e00 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
19e10 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
19e20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
19e30 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
19e40 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
19e50 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
19e60 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
19e70 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
19e80 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
19e90 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
19ea0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
19eb0 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
19ec0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
19ed0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
19ee0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
19ef0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
19f00 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
19f10 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
19f20 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
19f30 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
19f40 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
19f50 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
19f60 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
19f70 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
19f80 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
19f90 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
19fa0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
19fb0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
19fc0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
19fd0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
19fe0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
19ff0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1a000 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a010 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1a020 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1a030 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1a040 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1a050 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1a060 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1a070 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1a080 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1a090 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1a0a0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1a0b0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1a0c0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1a0d0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1a0e0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1a0f0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1a100 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1a110 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1a120 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1a130 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1a140 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1a150 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1a160 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1a170 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1a180 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1a190 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1a1a0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1a1b0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1a1c0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1a1d0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1a1e0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1a1f0 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1a200 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1a210 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1a220 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1a230 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1a240 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1a250 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1a260 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1a270 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1a280 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1a290 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1a2a0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1a2b0 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1a2c0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1a2d0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1a2e0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1a2f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1a300 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1a310 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1a320 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1a330 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1a340 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1a350 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1a360 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1a370 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a380 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1a390 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1a3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1a3b0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1a3c0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1a3d0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a3f0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1a400 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1a410 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1a420 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1a430 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1a440 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1a450 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1a460 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1a470 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1a480 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1a490 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1a4a0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1a4b0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1a4c0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1a4d0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1a4e0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1a4f0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1a500 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1a510 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1a520 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1a530 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1a540 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1a550 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1a560 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
1a570 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
1a580 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
1a590 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
1a5a0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
1a5b0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
1a5c0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
1a5d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1a5e0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20  r->jfd) );.  rc 
1a5f0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a600 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
1a610 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
1a620 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a630 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1a640 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
1a650 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
1a660 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
1a670 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
1a680 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
1a690 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
1a6a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1a6b0 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
1a6c0 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
1a6d0 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
1a6e0 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
1a6f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1a700 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
1a710 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
1a720 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
1a730 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f  ..  **.  ** TODO
1a740 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  : Technically th
1a750 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
1a760 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20  n error because 
1a770 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  it assumes that.
1a780 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65    ** buffer Page
1a790 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28  r.pTmpSpace is (
1a7a0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79  mxPathname+1) by
1a7b0 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69  tes or larger. i
1a7c0 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70  .e. that.  ** (p
1a7d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a7e0 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  >= pPager->pVfs-
1a7f0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20  >mxPathname+1). 
1a800 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c  Using os_unix.c,
1a810 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d  .  **  mxPathnam
1a820 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1a830 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1a840 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1a850 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1a860 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1a870 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1a880 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1a890 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1a8a0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1a8b0 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1a8c0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1a8d0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1a8e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a8f0 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1a900 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1a910 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a920 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1a930 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1a940 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1a950 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1a960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1a970 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1a980 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1a990 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1a9a0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1a9b0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1a9c0 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1a9d0 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1a9e0 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1a9f0 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1aa00 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1aa10 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1aa20 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1aa30 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1aa40 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1aa50 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1aa60 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1aa70 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1aa80 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1aa90 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1aaa0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1aab0 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1aac0 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1aad0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1aae0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1aaf0 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1ab00 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1ab10 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1ab20 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1ab30 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1ab40 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1ab50 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1ab60 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1ab70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1ab80 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1ab90 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1aba0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1abb0 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1abc0 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1abd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1abe0 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1abf0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1ac00 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ac10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1ac20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1ac30 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1ac40 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1ac50 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1ac60 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1ac70 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1ac80 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1ac90 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1aca0 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1acb0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1acc0 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1acd0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1ace0 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1acf0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1ad00 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1ad10 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1ad20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1ad30 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1ad40 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1ad50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1ad60 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1ad70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1ad80 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1ad90 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1ada0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1adb0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1adc0 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1add0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1ade0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1adf0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1ae00 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1ae10 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1ae20 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1ae30 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1ae40 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1ae50 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1ae60 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1ae70 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1ae80 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1ae90 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1aea0 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1aeb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1aec0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1aed0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1aee0 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1aef0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1af00 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1af10 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1af20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1af30 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1af40 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1af50 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1af60 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1af70 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1af80 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1af90 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1afa0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1afb0 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1afc0 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1afd0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1afe0 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1aff0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1b000 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1b010 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1b020 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1b030 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1b040 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1b050 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1b060 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1b070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1b080 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b090 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1b0a0 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1b0b0 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1b0c0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1b0d0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1b0e0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1b0f0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1b100 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1b110 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1b120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1b130 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b140 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1b150 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1b160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1b170 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1b180 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1b190 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1b1a0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1b1b0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1b1c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1b1d0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1b1e0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1b1f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b200 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1b210 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1b220 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1b230 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1b240 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1b250 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1b260 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1b270 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1b280 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1b290 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1b2a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1b2b0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1b2c0 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1b2d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b2e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1b2f0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1b300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b310 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1b320 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1b330 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1b340 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1b350 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1b360 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1b370 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1b380 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1b390 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1b3a0 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1b3b0 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1b3c0 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1b3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1b3e0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1b3f0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1b400 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1b410 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1b420 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1b430 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1b440 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b450 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1b460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
1b480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1b490 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
1b4a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b4b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b4c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1b4d0 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1b4e0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1b4f0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1b500 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1b510 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1b520 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1b530 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1b540 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1b550 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1b560 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1b570 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1b580 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1b590 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1b5a0 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1b5b0 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1b5c0 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1b5d0 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1b5e0 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1b600 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1b610 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1b620 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1b630 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1b640 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1b650 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1b660 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1b670 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1b680 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1b690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1b6a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1b6b0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1b6c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1b6d0 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1b6e0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1b6f0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1b700 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1b710 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1b720 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1b730 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1b740 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1b750 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1b760 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1b770 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1b780 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1b790 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1b7a0 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1b7b0 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1b7c0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1b7d0 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1b7e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1b7f0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1b800 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1b810 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b820 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1b830 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1b840 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1b850 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1b860 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1b870 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b880 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1b890 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1b8a0 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1b8b0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1b8c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1b8d0 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1b8e0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1b8f0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1b900 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1b910 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1b920 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1b930 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1b940 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1b950 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1b960 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
1b970 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1b980 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
1b990 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1b9a0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
1b9b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1b9c0 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
1b9d0 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
1b9e0 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
1b9f0 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
1ba00 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
1ba10 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
1ba20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
1ba30 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
1ba40 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
1ba50 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ba60 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
1ba70 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
1ba80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1ba90 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
1baa0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1bab0 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
1bac0 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
1bad0 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
1bae0 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
1baf0 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
1bb00 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
1bb10 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
1bb20 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
1bb30 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
1bb40 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
1bb50 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
1bb60 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1bb70 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
1bb80 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
1bb90 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
1bba0 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
1bbb0 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
1bbc0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1bbd0 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
1bbe0 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
1bbf0 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
1bc00 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
1bc10 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1bc20 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
1bc30 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1bc40 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
1bc50 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
1bc60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1bc70 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
1bc80 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1bc90 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
1bca0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1bcb0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1bcc0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1bcd0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1bce0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1bcf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1bd00 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1bd10 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
1bd20 65 72 2d 3e 6e 6f 53 79 6e 63 20 0a 20 20 20 26  er->noSync .   &
1bd30 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
1bd40 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1bd50 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
1bd60 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1bd70 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63  PEN).  ){.    rc
1bd80 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1bd90 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
1bda0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
1bdb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1bdc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bdd0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1bde0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1bdf0 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1be00 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
1be10 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1be20 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1be30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1be40 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
1be50 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
1be60 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
1be70 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
1be80 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1be90 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
1bea0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
1beb0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
1bec0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1bed0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
1bee0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
1bef0 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
1bf00 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1bf10 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1bf20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1bf30 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
1bf40 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1bf50 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
1bf60 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
1bf70 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
1bf80 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
1bf90 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
1bfa0 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
1bfb0 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
1bfc0 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
1bfd0 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
1bfe0 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
1bff0 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
1c000 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
1c010 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1c020 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1c030 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  Read the content
1c040 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75   for page pPg ou
1c050 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1c060 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20  e file and into 
1c070 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20  .** pPg->pData. 
1c080 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72  A shared lock or
1c090 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65   greater must be
1c0a0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1c0b0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65  abase.** file be
1c0c0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
1c0d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
1c0e0 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73  .** If page 1 is
1c0f0 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20   read, then the 
1c100 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
1c110 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73  bFileVers[] is s
1c120 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c  et to.** the val
1c130 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
1c140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1c150 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
1c160 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1c170 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69  n the IO error i
1c180 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
1c190 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68  e caller..** Oth
1c1a0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1c1b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
1c1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
1c1d0 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70  dDbPage(PgHdr *p
1c1e0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
1c1f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1c200 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a  er; /* Pager obj
1c210 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1c220 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a  ith page pPg */.
1c230 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1c240 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f  g->pgno;       /
1c250 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1c260 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72   read */.  int r
1c270 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1c280 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1c290 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1c2a0 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20  isInWal = 0;    
1c2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c2c0 20 69 66 20 70 61 67 65 20 69 73 20 69 6e 20 6c   if page is in l
1c2d0 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  og file */.  int
1c2e0 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e   pgsz = pPager->
1c2f0 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d  pageSize; /* Num
1c300 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
1c310 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
1c320 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1c330 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
1c340 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  && !MEMDB );.  a
1c350 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1c360 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
1c370 69 66 28 20 4e 45 56 45 52 28 21 69 73 4f 70 65  if( NEVER(!isOpe
1c380 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29  n(pPager->fd)) )
1c390 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1c3a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1c3b0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  ;.    memset(pPg
1c3c0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
1c3d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1c3e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c3f0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
1c400 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1c410 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  er) ){.    /* Tr
1c420 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70 61  y to pull the pa
1c430 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69 74  ge from the writ
1c440 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a  e-ahead log. */.
1c450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c460 57 61 6c 52 65 61 64 28 70 50 61 67 65 72 2d 3e  WalRead(pPager->
1c470 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 73 49  pWal, pgno, &isI
1c480 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70 50 67 2d  nWal, pgsz, pPg-
1c490 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 69  >pData);.  }.  i
1c4a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c4b0 20 26 26 20 21 69 73 49 6e 57 61 6c 20 29 7b 0a   && !isInWal ){.
1c4c0 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20      i64 iOffset 
1c4d0 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
1c4e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c4f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1c500 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1c510 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1c520 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b   pgsz, iOffset);
1c530 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c540 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1c550 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1c560 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c570 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1c580 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66  gno==1 ){.    if
1c590 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
1c5a0 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73 20   If the read is 
1c5b0 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  unsuccessful, se
1c5c0 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72 73  t the dbFileVers
1c5d0 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  [] to something.
1c5e0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69        ** that wi
1c5f0 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76 61  ll never be a va
1c600 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e  lid file version
1c610 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  .  dbFileVers[] 
1c620 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20  is a copy.      
1c630 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e  ** of bytes 24..
1c640 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1c650 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33  se.  Bytes 28..3
1c660 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  1 should always 
1c670 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  be.      ** zero
1c680 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20   or the size of 
1c690 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1c6a0 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e  page. Bytes 32..
1c6b0 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20  35 and 35..39.  
1c6c0 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1c6d0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
1c6e0 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30 78  ich are never 0x
1c6f0 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69  ffffffff.  So fi
1c700 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  lling.      ** p
1c710 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c720 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
1c730 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73  f bytes should s
1c740 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a  uffice..      **
1c750 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e  .      ** For an
1c760 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61 62   encrypted datab
1c770 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74 69  ase, the situati
1c780 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c  on is more compl
1c790 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20  ex:  bytes.     
1c7a0 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68   ** 24..39 of th
1c7b0 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  e database are w
1c7c0 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74  hite noise.  But
1c7d0 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
1c7e0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69   of.      ** whi
1c7f0 74 65 20 6e 6f 69 73 69 6e 67 20 65 71 75 61 6c  te noising equal
1c800 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1c810 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1c820 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1c830 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1c840 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1c850 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1c860 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1c870 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1c880 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1c890 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1c8a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1c8b0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1c8c0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1c8d0 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1c8e0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1c8f0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1c900 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1c910 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1c920 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1c930 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1c940 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1c950 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c960 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52  );..  PAGER_INCR
1c970 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
1c980 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
1c990 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1c9a0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
1c9b0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
1c9c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
1c9d0 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
1c9e0 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70 61  CE(("FETCH %d pa
1c9f0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1ca00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1ca10 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1ca20 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1ca30 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
1ca40 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1ca50 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ca60 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
1ca70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ca80 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66  s invoked once f
1ca90 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61  or each page tha
1caa0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1cab0 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  en .** written i
1cac0 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  nto the log file
1cad0 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e   when a WAL tran
1cae0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
1caf0 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d  d back..** Param
1cb00 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20  eter iPg is the 
1cb10 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73  page number of s
1cb20 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43  aid page. The pC
1cb30 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  tx argument .** 
1cb40 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  is actually a po
1cb50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1cb60 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  er structure..**
1cb70 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20  .** If page iPg 
1cb80 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
1cb90 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73  e cache, and has
1cba0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1cbb0 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69  references,.** i
1cbc0 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20  t is discarded. 
1cbd0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1cbe0 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
1cbf0 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a  ore outstanding.
1cc00 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74  ** references, t
1cc10 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1cc20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d  is reloaded from
1cc30 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
1cc40 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74  f the.** attempt
1cc50 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65   to reload conte
1cc60 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1cc70 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64  base is required
1cc80 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20   and fails, .** 
1cc90 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1cca0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68   error code. Oth
1ccb0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
1ccc0 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
1ccd0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1cce0 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50  ck(void *pCtx, P
1ccf0 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20  gno iPg){.  int 
1cd00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cd10 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1cd20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b  = (Pager *)pCtx;
1cd30 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1cd40 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1cd50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1cd60 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1cd70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1cd80 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1cd90 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1cda0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cdb0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1cdc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cdd0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1cde0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
1cdf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ce00 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1ce10 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1ce20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1ce30 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ce40 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ef(pPg);.    }. 
1ce50 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c   }..  /* Normall
1ce60 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  y, if a transact
1ce70 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1ce80 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70  ck, any backup p
1ce90 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a  rocesses are.  *
1cea0 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74  * updated as dat
1ceb0 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20  a is copied out 
1cec0 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
1ced0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f  journal and into
1cee0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
1cef0 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  se. This is not 
1cf00 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62  generally possib
1cf10 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61  le with a WAL da
1cf20 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20  tabase, as.  ** 
1cf30 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65  rollback involve
1cf40 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74  s simply truncat
1cf50 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
1cf60 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20  . Therefore, if 
1cf70 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65  one.  ** or more
1cf80 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72   frames have alr
1cf90 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1cfa0 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e  n to the log (an
1cfb0 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a  d therefore .  *
1cfc0 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e  * also copied in
1cfd0 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61  to the backup da
1cfe0 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74  tabases) as part
1cff0 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
1d000 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62  tion,.  ** the b
1d010 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72  ackups must be r
1d020 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  estarted..  */. 
1d030 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
1d040 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
1d050 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72  ackup);..  retur
1d060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d080 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
1d090 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
1d0a0 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61   on a WAL databa
1d0b0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1d0c0 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  t pagerRollbackW
1d0d0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1d0e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d100 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
1d110 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ode */.  PgHdr *
1d120 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  pList;          
1d130 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1d140 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
1d150 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20  to revert */..  
1d160 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73  /* For all pages
1d170 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68   in the cache th
1d180 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
1d190 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61   dirty or have a
1d1a0 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
1d1b0 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f   written (but no
1d1c0 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20  t committed) to 
1d1d0 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f  the log file, do
1d1e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a   one of the .  *
1d1f0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  * following:.  *
1d200 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61  *.  **   + Disca
1d210 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61  rd the cached pa
1d220 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d  ge (if refcount=
1d230 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b  =0), or.  **   +
1d240 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e   Reload page con
1d250 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61  tent from the da
1d260 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f  tabase (if refco
1d270 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70  unt>0)..  */.  p
1d280 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1d290 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1d2a0 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ze;.  rc = sqlit
1d2b0 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72  e3WalUndo(pPager
1d2c0 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64  ->pWal, pagerUnd
1d2d0 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
1d2e0 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c   *)pPager);.  pL
1d2f0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1d300 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1d310 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1d320 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
1d330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d340 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
1d350 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
1d360 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
1d370 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1d380 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1d390 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1d3a0 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
1d3b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d3c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1d3d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
1d3e0 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1d3f0 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
1d400 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
1d410 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
1d420 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
1d430 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
1d440 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
1d450 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
1d460 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1d470 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
1d480 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
1d490 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
1d4a0 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
1d4b0 6e 67 65 64 2e 20 0a 2a 2f 20 0a 73 74 61 74 69  nged. .*/ .stati
1d4c0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1d4d0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1d4e0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1d4f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1d500 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1d510 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1d520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d530 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1d540 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1d550 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1d560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1d570 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1d580 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1d590 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 2c  .  int isCommit,
1d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1d5c0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1d5d0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 5f 66 6c 61  /.  int sync_fla
1d5e0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
1d5f0 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20      /* Flags to 
1d600 70 61 73 73 20 74 6f 20 4f 73 53 79 6e 63 28 29  pass to OsSync()
1d610 20 28 6f 72 20 30 29 20 2a 2f 0a 29 7b 0a 20 20   (or 0) */.){.  
1d620 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1d630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d640 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1d650 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1d660 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 72  ger->pWal );.  r
1d670 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1d680 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1d690 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1d6a0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1d6b0 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1d6c0 43 6f 6d 6d 69 74 2c 20 73 79 6e 63 5f 66 6c 61  Commit, sync_fla
1d6d0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1d6e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d6f0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1d700 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1d710 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1d720 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1d730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1d740 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1d750 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1d760 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1d770 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1d780 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1d790 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 7b 0a  CHECK_PAGES.  {.
1d7a0 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1d7b0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1d7c0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 20 70  ; p=p->pDirty) p
1d7d0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1d7e0 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1d7f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d800 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1d810 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1d820 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1d830 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1d840 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1d850 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1d860 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1d870 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1d880 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1d890 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1d8a0 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1d8b0 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1d8c0 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1d8d0 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1d8e0 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1d8f0 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1d900 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1d910 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1d920 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1d930 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1d940 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1d950 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1d960 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1d970 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1d9a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1d9b0 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1d9c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d9d0 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1d9e0 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1d9f0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1da00 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1da10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1da20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1da30 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1da40 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1da50 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1da60 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1da70 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1da80 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1da90 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1daa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1dab0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1dac0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1dad0 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1dae0 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1daf0 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1db00 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1db10 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1db20 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1db30 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1db40 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1db50 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1db60 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1db70 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1db80 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1db90 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1dba0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1dbb0 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1dbc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dbd0 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
1dbe0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1dbf0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ager);.  }..  re
1dc00 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
1dc10 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
1dc20 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1dc30 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
1dc40 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20  transition from 
1dc50 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f  PAGER_OPEN.** to
1dc60 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
1dc70 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ate to determine
1dc80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1dc90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1dca0 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75  * in pages (assu
1dcb0 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ming the page si
1dcc0 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ze currently sto
1dcd0 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67  red in Pager.pag
1dce0 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  eSize)..**.** If
1dcf0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
1dd00 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1dd10 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
1dd20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1dd30 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  base.** in pages
1dd40 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
1dd50 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  nPage. Otherwise
1dd60 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1dd70 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49  (perhaps.** SQLI
1dd80 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20  TE_IOERR_FSTAT) 
1dd90 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1dda0 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
1ddb0 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
1ddc0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
1ddd0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
1dde0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e  pPager, Pgno *pn
1ddf0 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
1de00 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1de10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1de20 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
1de30 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
1de40 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73   Query the WAL s
1de50 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  ub-system for th
1de60 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e  e database size.
1de70 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29   The WalDbsize()
1de80 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  .  ** function r
1de90 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74  eturns zero if t
1dea0 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70  he WAL is not op
1deb0 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70  en (i.e. Pager.p
1dec0 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  Wal==0), or.  **
1ded0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1dee0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61   size is not ava
1def0 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61  ilable. The data
1df00 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
1df10 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
1df20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
1df30 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c  -system if the l
1df40 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  og file is empty
1df50 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   or.  ** contain
1df60 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69  s no valid commi
1df70 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
1df80 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
1df90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1dfa0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
1dfb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1dfc0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
1dfd0 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
1dfe0 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 20 20  noReadlock );.  
1dff0 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57  nPage = sqlite3W
1e000 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d  alDbsize(pPager-
1e010 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66  >pWal);..  /* If
1e020 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1e030 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c  ze was not avail
1e040 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1e050 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20  L sub-system,.  
1e060 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20  ** determine it 
1e070 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a  based on the siz
1e080 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e090 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73  e file. If the s
1e0a0 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ize.  ** of the 
1e0b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1e0c0 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
1e0d0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
1e0e0 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20  page-size,.  ** 
1e0f0 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68  round down to th
1e100 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20  e nearest page. 
1e110 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65  Except, any file
1e120 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20   larger than 0. 
1e130 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
1e140 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  e is considered 
1e150 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65  to contain at le
1e160 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20  ast one page..  
1e170 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
1e180 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d  0 ){.    i64 n =
1e190 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e1a0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1e1b0 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74  f db file in byt
1e1c0 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  es */.    assert
1e1d0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1e1e0 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
1e1f0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1e200 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1e210 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
1e220 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1e230 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1e240 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20  r->fd, &n);.    
1e250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e270 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e280 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67  }.    }.    nPag
1e290 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70  e = (Pgno)(n / p
1e2a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1e2b0 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d  ;.    if( nPage=
1e2c0 3d 30 20 26 26 20 6e 3e 30 20 29 7b 0a 20 20 20  =0 && n>0 ){.   
1e2d0 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20     nPage = 1;.  
1e2e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1e2f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1e300 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1e310 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1e320 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a  ter than the.  *
1e330 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78  * configured max
1e340 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65  imum pager numbe
1e350 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  r, increase the 
1e360 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f  allowed limit so
1e370 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66  .  ** that the f
1e380 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e  ile can be read.
1e390 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1e3a0 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  e>pPager->mxPgno
1e3b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1e3c0 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
1e3d0 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e  Page;.  }..  *pn
1e3e0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1e3f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e400 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1e410 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
1e420 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  ** Check if the 
1e430 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20  *-wal file that 
1e440 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
1e450 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1e460 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20  ed by pPager.** 
1e470 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61  exists if the da
1e480 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
1e490 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68  py, or verify th
1e4a0 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  at the *-wal fil
1e4b0 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  e does.** not ex
1e4c0 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67  ist (by deleting
1e4d0 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61   it) if the data
1e4e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70  base file is emp
1e4f0 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
1e500 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
1e510 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a   empty and the *
1e520 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1e530 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72  , open the pager
1e540 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  .** in WAL mode.
1e550 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1e560 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66  e is empty or if
1e570 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65   no *-wal file e
1e580 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20  xists and.** if 
1e590 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1e5a0 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72   make sure Pager
1e5b0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20  .journalMode is 
1e5c0 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41  not set to.** PA
1e5d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1e5e0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  WAL..**.** Retur
1e5f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61  n SQLITE_OK or a
1e600 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  n error code..**
1e610 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1e620 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45  ust hold a SHARE
1e630 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
1e640 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
1e650 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  all this.** func
1e660 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e  tion. Because an
1e670 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1e680 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69  on the db file i
1e690 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65  s required to de
1e6a0 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f  lete .** a WAL o
1e6b0 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64  n a none-empty d
1e6c0 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e  atabase, this en
1e6d0 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e  sures there is n
1e6e0 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  o race condition
1e6f0 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65   .** between the
1e700 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77   xAccess() below
1e710 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28   and an xDelete(
1e720 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64  ) being executed
1e730 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68   by some .** oth
1e740 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  er connection..*
1e750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1e760 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
1e770 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1e780 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1e7a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1e7b0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1e7c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e7d0 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1e7e0 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d  _LOCK || pPager-
1e7f0 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 3b 0a 0a  >noReadlock );..
1e800 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
1e810 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
1e820 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e840 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
1e850 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50   exists */.    P
1e860 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e880 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
1e890 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
1e8a0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
1e8b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
1e8c0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e8d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e8e0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
1e8f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1e900 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
1e910 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
1e920 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
1e930 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20      isWal = 0;. 
1e940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e950 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1e960 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
1e970 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
1e980 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
1e990 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1e9a0 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29  , &isWal.      )
1e9b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e9c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e9d0 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c  .      if( isWal
1e9e0 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
1e9f0 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
1ea00 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
1ea10 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
1ea20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1ea30 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1ea40 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  nWal(pPager, 0);
1ea50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1ea60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ea70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
1ea80 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
1ea90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1eaa0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
1eab0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
1eac0 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ELETE;.      }. 
1ead0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1eae0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
1eaf0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
1eb00 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
1eb10 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
1eb20 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
1eb30 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
1eb40 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
1eb50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1eb60 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
1eb70 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
1eb80 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
1eb90 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
1eba0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
1ebb0 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
1ebc0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
1ebd0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
1ebe0 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
1ebf0 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
1ec00 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
1ec10 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1ec20 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
1ec30 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
1ec40 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
1ec50 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
1ec60 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
1ec70 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
1ec80 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
1ec90 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
1eca0 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
1ecb0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
1ecc0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
1ecd0 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
1ece0 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
1ecf0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
1ed00 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
1ed10 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
1ed20 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1ed30 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
1ed40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
1ed50 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
1ed60 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
1ed70 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
1ed80 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
1ed90 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
1eda0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
1edb0 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
1edc0 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
1edd0 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
1ede0 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
1edf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1ee00 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
1ee10 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
1ee20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
1ee30 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
1ee40 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
1ee50 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
1ee60 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
1ee70 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
1ee80 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
1ee90 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
1eea0 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
1eeb0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
1eec0 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
1eed0 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
1eee0 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
1eef0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
1ef00 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
1ef10 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
1ef20 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
1ef30 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
1ef40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
1ef50 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
1ef60 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
1ef70 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
1ef80 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
1ef90 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
1efa0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
1efb0 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
1efc0 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
1efd0 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
1efe0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
1eff0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
1f000 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1f010 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
1f020 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
1f030 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
1f040 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
1f050 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
1f060 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
1f070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1f080 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
1f090 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
1f0a0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1f0b0 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
1f0c0 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
1f0d0 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
1f0e0 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
1f0f0 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
1f100 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
1f110 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
1f120 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
1f130 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
1f140 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
1f150 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
1f160 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
1f170 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
1f180 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
1f190 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
1f1a0 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
1f1b0 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
1f1c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f1d0 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
1f1e0 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
1f1f0 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
1f200 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
1f210 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f230 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
1f240 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1f250 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1f260 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
1f270 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
1f280 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
1f290 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
1f2a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1f2b0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
1f2c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1f2d0 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
1f2e0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
1f2f0 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
1f300 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
1f310 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
1f320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f330 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
1f340 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
1f350 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1f360 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
1f370 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  LOCKED );..  /* 
1f380 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
1f390 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
1f3a0 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
1f3b0 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
1f3c0 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
1f3d0 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
1f3e0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
1f3f0 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
1f400 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
1f410 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
1f420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f430 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
1f440 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64  ..  /* Set the d
1f450 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63  atabase size bac
1f460 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69  k to the value i
1f470 74 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65  t was before the
1f480 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a   savepoint .  **
1f490 20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20   being reverted 
1f4a0 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  was opened..  */
1f4b0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1f4c0 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f  e = pSavepoint ?
1f4d0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72   pSavepoint->nOr
1f4e0 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f  ig : pPager->dbO
1f4f0 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  rigSize;.  pPage
1f500 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1f510 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1f520 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70  pFile;..  if( !p
1f530 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67  Savepoint && pag
1f540 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1f550 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1f560 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1f570 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
1f580 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a  /* Use pPager->j
1f590 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65  ournalOff as the
1f5a0 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20   effective size 
1f5b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  of the main roll
1f5c0 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
1f5d0 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66  l.  The actual f
1f5e0 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72  ile might be lar
1f5f0 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e  ger than this in
1f600 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52  .  ** PAGER_JOUR
1f610 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1f620 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   or PAGER_JOURNA
1f630 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20  LMODE_PERSIST.  
1f640 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a  But anything.  *
1f650 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a  * past pPager->j
1f660 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66  ournalOff is off
1f670 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20  -limits to us.. 
1f680 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
1f690 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
1f6a0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
1f6b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
1f6c0 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20   || szJ==0 );.. 
1f6d0 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c   /* Begin by rol
1f6e0 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
1f6f0 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  s from the main 
1f700 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
1f710 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61   at.  ** PagerSa
1f720 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
1f730 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
1f740 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  o the next journ
1f750 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  al header..  ** 
1f760 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72  There might be r
1f770 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61  ecords in the ma
1f780 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  in journal that 
1f790 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62  have a page numb
1f7a0 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20  er.  ** greater 
1f7b0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
1f7c0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28   database size (
1f7d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20  pPager->dbSize) 
1f7e0 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77  but those.  ** w
1f7f0 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61  ill be skipped a
1f800 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50  utomatically.  P
1f810 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74  ages are added t
1f820 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a  o pDone as they.
1f830 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20    ** are played 
1f840 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  back..  */.  if(
1f850 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21   pSavepoint && !
1f860 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1f870 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  er) ){.    iHdrO
1f880 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
1f890 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
1f8a0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
1f8b0 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
1f8c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f8d0 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
1f8e0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
1f8f0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1f900 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
1f910 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
1f920 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1f930 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1f940 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
1f950 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f960 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29  ff, pDone, 1, 1)
1f970 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1f980 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
1f990 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ONE );.  }else{.
1f9a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1f9b0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a  nalOff = 0;.  }.
1f9c0 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72  .  /* Continue r
1f9d0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
1f9e0 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  rds out of the m
1f9f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
1fa00 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65  ting at.  ** the
1fa10 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
1fa20 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63  eader seen and c
1fa30 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20  ontinuing until 
1fa40 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e  the effective en
1fa50 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61  d.  ** of the ma
1fa60 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  in journal file.
1fa70 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b    Continue to sk
1fa80 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  ip out-of-range 
1fa90 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63  pages and.  ** c
1faa0 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70  ontinue adding p
1fab0 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  ages rolled back
1fac0 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a   to pDone..  */.
1fad0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1fae0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1faf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a  ->journalOff<szJ
1fb00 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
1fb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1fb20 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1fb30 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b    u32 nJRec = 0;
1fb40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fb50 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64  f Journal Record
1fb60 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d  s */.    u32 dum
1fb70 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  my;.    rc = rea
1fb80 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1fb90 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52  er, 0, szJ, &nJR
1fba0 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
1fbb0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1fbc0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20  ITE_DONE );..   
1fbd0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22   /*.    ** The "
1fbe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1fbf0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1fc00 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1fc10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20  r->journalOff". 
1fc20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65     ** test is re
1fc30 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20  lated to ticket 
1fc40 23 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20  #2565.  See the 
1fc50 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68  discussion in th
1fc60 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70  e.    ** pager_p
1fc70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69  layback() functi
1fc80 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  on for additiona
1fc90 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
1fca0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a     */.    if( nJ
1fcb0 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Rec==0 .     && 
1fcc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1fcd0 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1fce0 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1fcf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
1fd00 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63    ){.      nJRec
1fd10 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20   = (u32)((szJ - 
1fd20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1fd30 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ff)/JOURNAL_PG_S
1fd40 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1fd50 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
1fd60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1fd70 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
1fd80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
1fd90 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
1fda0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1fdb0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
1fdc0 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
1fdd0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e  journalOff, pDon
1fde0 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 1, 1);.    }.
1fdf0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
1fe00 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
1fe10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
1fe20 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1fe30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1fe40 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  >=szJ );..  /* F
1fe50 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
1fe60 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
1fe70 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
1fe80 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
1fe90 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
1fea0 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
1feb0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1fec0 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
1fed0 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
1fee0 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
1fef0 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
1ff00 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
1ff10 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
1ff20 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
1ff30 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
1ff40 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1ff50 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36  ounter */.    i6
1ff60 34 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65  4 offset = pSave
1ff70 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28  point->iSubRec*(
1ff80 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
1ff90 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  ze);..    if( pa
1ffa0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1ffb0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1ffc0 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f  sqlite3WalSavepo
1ffd0 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  intUndo(pPager->
1ffe0 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74  pWal, pSavepoint
1fff0 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20  ->aWalData);.   
20000 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53   }.    for(ii=pS
20010 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
20020 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
20030 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
20040 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
20050 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
20060 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65  set==ii*(4+pPage
20070 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
20080 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20090 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
200a0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
200b0 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
200c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
200d0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
200e0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
200f0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
20100 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
20110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20120 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
20130 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
20140 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
20150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
20160 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
20170 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
20180 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
20190 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
201a0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
201b0 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
201c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
201d0 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
201e0 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
201f0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
20200 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
20210 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
20220 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
20230 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
20240 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
20250 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
20260 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
20270 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
20280 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
20290 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
202a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
202b0 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
202c0 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
202d0 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
202e0 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
202f0 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
20300 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
20310 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
20320 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
20330 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
20340 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
20350 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
20360 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
20370 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
20380 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
20390 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
203a0 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
203b0 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
203c0 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
203d0 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
203e0 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
203f0 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
20400 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
20410 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
20430 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
20440 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
20450 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
20460 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
20470 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
20480 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
20490 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
204a0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
204b0 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
204c0 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
204d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
204e0 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
204f0 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
20500 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
20510 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
20520 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
20530 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
20540 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
20550 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
20560 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
20570 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
20580 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
20590 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
205a0 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
205b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
205c0 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
205d0 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
205e0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
205f0 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
20600 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
20610 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
20620 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
20630 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
20640 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
20650 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
20660 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
20670 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
20680 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
20690 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
206a0 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
206b0 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
206c0 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
206d0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
206e0 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
206f0 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
20700 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
20710 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
20720 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
20730 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
20740 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
20750 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
20760 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
20770 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e  l, int bFullFsyn
20780 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
20790 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
207a0 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
207b0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
207c0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
207d0 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
207e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
207f0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
20800 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
20810 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54  bFullFsync?SQLIT
20820 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
20830 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
20840 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20850 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
20860 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
20870 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
20880 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
20890 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
208a0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
208b0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
208c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
208d0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
208e0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
208f0 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
20900 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
20910 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
20920 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
20930 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
20940 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
20950 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
20960 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
20970 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
20980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20990 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
209a0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
209b0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
209c0 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
209d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
209e0 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
209f0 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
20a00 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
20a10 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
20a20 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
20a30 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
20a40 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
20a50 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
20a60 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
20a70 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
20a80 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
20a90 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
20aa0 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
20ab0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
20ac0 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
20ad0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
20ae0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
20af0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20b00 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
20b10 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
20b20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
20b30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20b40 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
20b50 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
20b60 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
20b70 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
20b80 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
20b90 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
20ba0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
20bb0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
20bc0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
20bd0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
20be0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
20bf0 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
20c00 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
20c10 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
20c20 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
20c30 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
20c40 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
20c50 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
20c60 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
20c70 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
20c80 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
20c90 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
20ca0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
20cb0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
20cc0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
20cd0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
20ce0 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
20cf0 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
20d00 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
20d10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20d20 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
20d30 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
20d40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20d50 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
20d60 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
20d70 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
20d80 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
20d90 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
20da0 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
20db0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
20dc0 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
20dd0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
20de0 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
20df0 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
20e00 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
20e10 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
20e20 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
20e30 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
20e40 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
20e50 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
20e60 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
20e70 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
20e80 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
20e90 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
20ea0 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
20eb0 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
20ec0 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
20ed0 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
20ee0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
20ef0 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
20f00 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
20f30 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
20f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20f70 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
20f80 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
20f90 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
20fa0 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
20fb0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
20fc0 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
20fd0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
20fe0 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
20ff0 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
21000 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
21010 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
21020 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
21030 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
21040 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
21050 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
21060 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
21070 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
21080 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
21090 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
210a0 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
210b0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
210c0 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
210d0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
210e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
210f0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
21100 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
21110 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
21120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
21130 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
21140 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
21150 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
21160 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
21170 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
21180 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
21190 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
211a0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
211b0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
211c0 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
211d0 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20  ndler */.){  .  
211e0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
211f0 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
21200 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
21210 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
21220 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
21230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
21240 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
21250 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
21260 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
21270 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
21280 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
21290 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
212a0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
212b0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
212c0 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
212d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
212e0 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
212f0 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
21300 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
21310 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
21320 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
21330 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
21340 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
21350 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f  R_xxx sub-code o
21360 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
21370 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
21380 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
21390 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
213a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
213b0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
213c0 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
213d0 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
213e0 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
213f0 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
21400 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
21410 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
21420 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
21430 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
21440 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
21450 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
21460 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
21470 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
21480 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
21490 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
214a0 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
214b0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
214c0 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
214d0 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
214e0 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
214f0 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
21500 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
21510 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
21520 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
21530 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
21540 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
21550 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
21560 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
21570 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
21580 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
21590 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
215a0 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
215b0 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
215c0 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
215d0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
215e0 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
215f0 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
21600 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
21610 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
21620 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
21630 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
21640 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
21650 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
21660 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
21670 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
21680 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
21690 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
216a0 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
216b0 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
216c0 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
216d0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
216e0 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
216f0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
21700 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
21710 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
21720 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
21730 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
21740 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
21750 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
21760 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21770 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
21780 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33  ager *pPager, u3
21790 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  2 *pPageSize, in
217a0 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
217b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
217c0 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  K;..  /* It is n
217d0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
217e0 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f  o a full assert_
217f0 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65  pager_state() he
21800 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a  re, as this.  **
21810 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
21820 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
21830 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c  hin PagerOpen(),
21840 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
21850 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61  e.  ** of the Pa
21860 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  ger object is in
21870 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
21880 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ent..  **.  ** A
21890 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
218a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
218b0 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
218c0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
218d0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f  .  ** PAGER_ERRO
218e0 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e  R state. But sin
218f0 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ce PAGER_ERROR s
21900 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20  tate guarantees 
21910 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20  that.  ** there 
21920 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  is at least one 
21930 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
21940 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73   reference, this
21950 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
21960 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
21970 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a  at case anyhow..
21980 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65    */..  u32 page
21990 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
219a0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
219b0 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
219c0 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
219d0 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
219e0 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
219f0 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
21a00 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
21a10 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
21a20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
21a30 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
21a40 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
21a50 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
21a60 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32  & pageSize!=(u32
21a70 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
21a80 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
21a90 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20   *pNew = NULL;  
21aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
21ab0 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
21ac0 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20      i64 nByte = 
21ad0 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  0;..    if( pPag
21ae0 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
21af0 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28  _OPEN && isOpen(
21b00 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
21b10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21b20 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
21b30 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
21b40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
21b50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21b60 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
21b70 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
21b80 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
21b90 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
21ba0 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  w ) rc = SQLITE_
21bb0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
21bc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
21be0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
21bf0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
21c00 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28  dbSize = (Pgno)(
21c10 6e 42 79 74 65 2f 70 61 67 65 53 69 7a 65 29 3b  nByte/pageSize);
21c20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
21c30 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
21c40 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ze;.      sqlite
21c50 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
21c60 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
21c70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
21c80 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20  Space = pNew;.  
21c90 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
21ca0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
21cb0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
21cc0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
21cd0 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65   }..  *pPageSize
21ce0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
21cf0 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ize;.  if( rc==S
21d00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21d10 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
21d20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
21d30 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
21d40 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
21d50 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
21d60 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
21d70 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
21d80 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
21d90 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
21da0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
21db0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21dc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21dd0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
21de0 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
21df0 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
21e00 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
21e10 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
21e20 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
21e30 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
21e40 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
21e50 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
21e60 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
21e70 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
21e80 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
21e90 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
21ea0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
21eb0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
21ec0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
21ed0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
21ee0 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
21ef0 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
21f00 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
21f10 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
21f20 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
21f30 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
21f40 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
21f50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21f60 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
21f70 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
21f80 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
21f90 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
21fa0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
21fb0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
21fc0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
21fd0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
21fe0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
21ff0 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
22000 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
22010 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
22020 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
22030 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
22040 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
22050 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
22060 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
22070 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
22080 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
22090 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
220a0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
220b0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
220c0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
220d0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
220e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
220f0 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
22100 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
22110 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
22120 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 6d 78 50  N && pPager->mxP
22130 67 6e 6f 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  gno<pPager->dbSi
22140 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ze ){.    pPager
22150 2d 3e 6d 78 50 67 6e 6f 20 3d 20 70 50 61 67 65  ->mxPgno = pPage
22160 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20  r->dbSize;.  }. 
22170 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22180 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
22190 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
221a0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
221b0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
221c0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
221d0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
221e0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
221f0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
22200 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
22210 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
22220 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
22230 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
22240 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
22250 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
22260 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
22270 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
22280 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
22290 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
222a0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
222b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
222c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
222d0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
222e0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
222f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
22300 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
22310 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
22320 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
22330 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
22340 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
22350 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
22360 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
22370 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
22380 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
22390 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
223a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
223b0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
223c0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
223d0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
223e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
223f0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
22400 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
22410 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
22420 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
22430 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
22440 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
22450 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
22460 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
22470 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
22480 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
22490 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
224a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
224b0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
224c0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
224d0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
224e0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
224f0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
22500 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
22510 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
22520 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
22530 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
22540 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
22550 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
22560 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
22570 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
22580 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
22590 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
225a0 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
225b0 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
225c0 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
225d0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
225e0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
225f0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
22600 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
22610 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
22620 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
22630 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
22640 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
22650 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
22660 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
22670 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22680 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
22690 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
226a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
226b0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
226c0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
226d0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
226e0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
226f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22700 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
22710 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
22720 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
22730 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
22740 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
22750 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
22760 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
22770 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
22780 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
22790 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
227a0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
227b0 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
227c0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
227d0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
227e0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
227f0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
22800 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
22810 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
22820 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
22830 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
22840 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
22850 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
22860 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
22870 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
22880 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
22890 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
228a0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
228b0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
228c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
228d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
228e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
228f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22900 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
22910 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
22920 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
22930 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
22940 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
22950 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
22960 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
22970 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
22980 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
22990 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
229a0 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
229b0 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
229c0 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
229d0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
229e0 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
229f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22a00 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
22a10 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
22a20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
22a30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
22a40 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
22a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
22a60 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
22a70 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
22a80 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
22a90 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
22aa0 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
22ab0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
22ac0 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
22ad0 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
22ae0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
22af0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
22b00 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
22b10 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
22b20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
22b30 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
22b40 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
22b50 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
22b60 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
22b70 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
22b80 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
22b90 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
22ba0 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
22bb0 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
22bc0 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
22bd0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
22be0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
22bf0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
22c00 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
22c10 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
22c20 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
22c30 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
22c40 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
22c50 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22c60 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
22c70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
22c80 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
22c90 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
22ca0 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
22cb0 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
22cc0 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
22cd0 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
22ce0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
22cf0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
22d00 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
22d10 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
22d20 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
22d30 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
22d40 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22d70 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
22d80 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
22d90 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
22da0 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
22db0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
22dc0 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
22dd0 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
22de0 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
22df0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
22e00 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
22e10 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
22e20 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
22e30 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
22e40 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
22e50 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
22e60 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
22e70 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
22e80 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
22e90 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
22ea0 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
22eb0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
22ec0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
22ed0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
22ee0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
22ef0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
22f00 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
22f10 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
22f20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
22f30 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
22f40 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
22f50 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
22f60 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
22f70 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
22f80 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
22f90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
22fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
22fb0 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
22fc0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
22fd0 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
22fe0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
22ff0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
23000 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
23010 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
23020 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
23030 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
23040 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
23050 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
23060 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
23070 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
23080 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
23090 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
230a0 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
230b0 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
230c0 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
230d0 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
230e0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
230f0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
23100 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
23110 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
23120 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
23130 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
23140 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
23150 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
23160 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
23170 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
23180 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
23190 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
231a0 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
231b0 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
231c0 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
231d0 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
231e0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
231f0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
23200 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
23210 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
23220 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
23230 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
23240 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
23250 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
23260 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
23270 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
23280 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
23290 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
232a0 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 75  correct behaviou
232b0 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
232c0 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
232d0 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
232e0 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
232f0 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
23300 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
23310 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
23320 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
23330 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
23340 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
23350 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
23360 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
23370 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
23380 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
23390 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
233a0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
233b0 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
233c0 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
233d0 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
233e0 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
233f0 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
23400 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
23410 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
23420 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
23430 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
23440 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
23450 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
23460 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
23470 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
23480 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
23490 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
234a0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
234b0 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
234c0 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
234d0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
234e0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
234f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
23500 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
23510 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
23520 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
23530 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
23540 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
23550 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
23560 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
23570 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
23580 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
23590 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
235a0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
235b0 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
235c0 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
235d0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
235e0 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
235f0 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
23600 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
23610 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
23620 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
23630 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
23640 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
23650 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
23660 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
23670 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
23680 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
23690 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  mitted..*/.void 
236a0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
236b0 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
236c0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
236d0 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
236e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
236f0 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
23700 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
23710 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
23720 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
23730 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
23740 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72  Page;.  assertTr
23750 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
23760 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
23770 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23780 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f  n is called befo
23790 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20  re attempting a 
237a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
237b0 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63  back. It.** sync
237c0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
237d0 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e  le to disk, then
237e0 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f   sets pPager->jo
237f0 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a  urnalHdr to the.
23800 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  ** size of the j
23810 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74  ournal file so t
23820 68 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c  hat the pager_pl
23830 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
23840 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74   knows.** that t
23850 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
23860 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
23870 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79  synced..**.** Sy
23880 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  ncing a hot-jour
23890 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  nal to disk befo
238a0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
238b0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e   roll it back en
238c0 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69  sures .** that i
238d0 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  f a power-failur
238e0 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  e occurs during 
238f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  the rollback, th
23900 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a  e process that.*
23910 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62  * attempts rollb
23920 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79  ack following sy
23930 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65  stem recovery se
23940 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72  es the same jour
23950 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  nal.** content a
23960 73 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  s this process..
23970 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
23980 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e  ing goes as plan
23990 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ned, SQLITE_OK i
239a0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
239b0 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51  rwise, .** an SQ
239c0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
239d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
239e0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
239f0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
23a00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23a10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
23a20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
23a30 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
23a40 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
23a50 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
23a60 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20  C_NORMAL);.  }. 
23a70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23a80 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
23a90 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
23aa0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
23ab0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
23ac0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
23ad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
23ae0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
23af0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
23b00 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
23b10 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
23b20 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
23b30 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
23b40 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
23b50 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
23b60 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
23b70 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
23b80 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
23b90 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
23ba0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
23bb0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
23bc0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
23bd0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
23be0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
23bf0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
23c00 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
23c10 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
23c20 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
23c30 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
23c40 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
23c50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
23c60 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
23c70 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
23c80 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
23c90 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
23ca0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
23cb0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
23cc0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
23cd0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
23ce0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
23cf0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
23d00 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
23d10 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
23d20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
23d30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23d40 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
23d50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20   *pPager){.  u8 
23d60 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50  *pTmp = (u8 *)pP
23d70 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
23d80 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
23d90 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
23da0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
23db0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
23dc0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
23dd0 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  rCode = 0; */.  
23de0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
23df0 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eMode = 0;.#ifnd
23e00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
23e10 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 43  AL.  sqlite3WalC
23e20 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57 61  lose(pPager->pWa
23e30 6c 2c 0a 20 20 20 20 28 70 50 61 67 65 72 2d 3e  l,.    (pPager->
23e40 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 70 50 61  noSync ? 0 : pPa
23e50 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
23e60 2c 20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  , .    pPager->p
23e70 61 67 65 53 69 7a 65 2c 20 70 54 6d 70 0a 20 20  ageSize, pTmp.  
23e80 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57 61  );.  pPager->pWa
23e90 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  l = 0;.#endif.  
23ea0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
23eb0 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
23ec0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
23ed0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
23ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
23ef0 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e   it is open, syn
23f00 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
23f10 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
23f20 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  g UnlockAndRollb
23f30 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ack..    ** If t
23f40 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c  his is not done,
23f50 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65   then an unsynce
23f60 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
23f70 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20   open journal . 
23f80 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62     ** file may b
23f90 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
23fa0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
23fb0 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
23fc0 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20  ure occurs .    
23fd0 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73  ** while this is
23fe0 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
23ff0 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
24000 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
24010 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
24020 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
24030 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
24040 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
24050 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65  , shift the page
24060 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  r.    ** into th
24070 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54  e ERROR state. T
24080 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63  his causes Unloc
24090 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  kAndRollback to 
240a0 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a  unlock the.    *
240b0 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  * database and c
240c0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
240d0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74   file without at
240e0 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
240f0 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20   it.    ** back 
24100 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20  or finalize it. 
24110 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73  The next databas
24120 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65  e user will have
24130 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e   to do hot-journ
24140 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  al.    ** rollba
24150 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73  ck before access
24160 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
24170 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
24180 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24190 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
241a0 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
241b0 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63  Pager, pagerSync
241c0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
241d0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
241e0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
241f0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
24200 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
24210 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
24220 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
24230 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
24240 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c   PAGERTRACE(("CL
24250 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
24260 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
24270 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
24280 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
24290 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
242a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
242b0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
242c0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
242d0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
242e0 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  Tmp);.  sqlite3P
242f0 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
24300 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
24310 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
24320 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67  CODEC.  if( pPag
24330 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
24340 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
24350 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
24360 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ec);.#endif..  a
24370 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
24380 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
24390 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
243a0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
243b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
243c0 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
243d0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
243e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
243f0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
24400 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24410 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
24420 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
24430 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
24440 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
24450 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
24460 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
24470 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
24480 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
24490 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
244a0 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
244b0 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
244c0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
244d0 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
244e0 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
244f0 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
24500 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
24510 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
24520 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
24530 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
24540 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
24550 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
24560 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
24570 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
24580 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
24590 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
245a0 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
245b0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
245c0 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
245d0 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
245e0 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
245f0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
24600 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
24610 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  noSync flag is s
24620 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
24630 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
24640 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
24650 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
24660 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
24670 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
24680 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76   and the .** dev
24690 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
246a0 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66  ics of the the f
246b0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
246c0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
246d0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
246e0 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
246f0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
24700 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
24710 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
24720 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
24730 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
24740 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
24750 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
24760 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
24770 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
24780 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
24790 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
247a0 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
247b0 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
247c0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
247d0 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
247e0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
247f0 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
24800 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
24810 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
24820 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
24830 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
24840 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
24850 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
24860 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
24870 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
24880 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
24890 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
248a0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
248b0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
248c0 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
248d0 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
248e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
248f0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
24900 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
24910 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
24920 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
24930 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
24940 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
24950 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
24960 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
24970 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
24980 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
24990 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
249a0 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
249b0 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
249c0 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
249d0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
249e0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
249f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
24a00 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
24a10 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
24a20 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
24a30 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
24a40 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
24a50 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
24a60 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
24a70 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
24a80 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
24a90 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
24aa0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
24ab0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
24ac0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
24ad0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
24ae0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
24af0 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
24b00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
24b30 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
24b40 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24b50 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
24b60 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
24b70 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
24b80 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
24b90 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
24ba0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
24bb0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
24bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
24bd0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
24be0 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
24bf0 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
24c00 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
24c10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24c20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
24c30 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
24c40 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
24c50 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
24c60 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
24c70 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
24c80 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
24c90 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
24ca0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
24cb0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
24cc0 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
24cd0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
24ce0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
24cf0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
24d00 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
24d10 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
24d20 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
24d30 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
24d40 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
24d50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
24d60 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
24d70 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
24d80 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
24d90 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
24da0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
24db0 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
24dc0 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
24dd0 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
24de0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
24df0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
24e00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
24e10 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
24e20 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
24e30 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
24e40 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
24e50 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
24e60 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
24e70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
24e80 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
24e90 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
24ea0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
24eb0 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
24ec0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
24ed0 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
24ee0 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
24ef0 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
24f00 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
24f10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
24f20 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
24f30 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
24f40 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
24f50 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
24f60 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
24f70 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
24f80 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
24f90 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
24fa0 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
24fb0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
24fc0 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
24fd0 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
24fe0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
24ff0 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
25000 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
25010 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
25020 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
25030 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
25040 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
25050 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
25060 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
25070 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
25080 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
25090 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
250a0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
250b0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
250c0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
250d0 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
250e0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
250f0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
25100 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
25110 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
25120 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
25130 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
25140 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
25150 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
25160 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
25170 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
25180 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
25190 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
251a0 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
251b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
251c0 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
251d0 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
251e0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
251f0 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
25200 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
25210 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
25220 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
25230 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
25240 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
25250 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
25260 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
25270 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
25280 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
25290 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
252a0 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
252b0 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
252c0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
252d0 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
252e0 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
252f0 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
25300 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
25310 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
25320 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
25330 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
25340 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
25350 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
25360 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
25370 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
25380 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
25390 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
253a0 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
253b0 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
253c0 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
253d0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
253e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
253f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
25400 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
25410 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
25420 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25430 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
25440 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
25450 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
25460 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
25470 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
25480 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
25490 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
254a0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
254b0 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
254c0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
254d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
254e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
254f0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
25500 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
25510 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
25520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
25530 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
25540 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
25550 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
25560 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
25570 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
25580 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
25590 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
255a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
255b0 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
255c0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
255d0 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
255e0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
255f0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
25600 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
25610 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
25620 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
25630 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
25640 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
25650 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
25660 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
25670 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
25680 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
25690 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
256a0 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
256b0 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
256c0 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
256d0 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
256e0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
256f0 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
25700 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
25710 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
25720 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
25730 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
25740 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
25750 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
25760 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
25770 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
25780 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
25790 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
257a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
257b0 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
257c0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
257d0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
257e0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
257f0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
25800 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
25810 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
25820 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
25830 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
25840 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
25850 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25860 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
25870 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
25880 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
25890 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
258a0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
258b0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
258c0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
258d0 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  JHDR %p %lld\n",
258e0 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
258f0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20  >journalHdr));. 
25900 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25910 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20  te3OsWrite(.    
25920 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
25930 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
25940 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70  zeof(zHeader), p
25950 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
25960 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
25970 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25980 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
25990 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
259a0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
259b0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
259c0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
259d0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
259e0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
259f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
25a00 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
25a10 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
25a20 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
25a30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
25a40 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
25a50 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
25a60 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20  >sync_flags| .  
25a70 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
25a80 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c  >sync_flags==SQL
25a90 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
25aa0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
25ab0 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
25ac0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
25ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
25ae0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
25af0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
25b00 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
25b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
25b20 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
25b30 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
25b40 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
25b50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
25b60 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
25b70 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
25b80 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
25b90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
25ba0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25bb0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
25bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
25bd0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
25be0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
25bf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
25c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
25c10 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
25c20 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
25c30 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
25c40 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
25c50 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
25c60 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
25c70 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
25c80 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
25c90 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
25ca0 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
25cb0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
25cc0 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
25cd0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
25ce0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
25cf0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
25d00 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
25d10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
25d20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
25d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25d40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
25d50 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
25d60 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
25d70 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
25d80 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
25d90 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
25da0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
25db0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
25dc0 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
25dd0 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
25de0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
25df0 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
25e00 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
25e10 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
25e20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
25e30 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
25e40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
25e50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
25e60 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
25e70 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
25e80 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
25e90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
25ea0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
25eb0 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
25ec0 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
25ed0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
25ee0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
25ef0 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
25f00 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
25f10 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
25f20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
25f30 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
25f40 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
25f50 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
25f60 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
25f70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
25f80 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
25f90 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
25fa0 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
25fb0 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
25fc0 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
25fd0 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
25fe0 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
25ff0 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
26000 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
26010 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
26020 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
26030 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
26040 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
26050 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
26060 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
26070 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
26080 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
26090 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
260a0 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
260b0 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
260c0 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
260d0 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
260e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
260f0 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
26100 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
26110 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
26120 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
26130 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
26140 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
26150 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
26160 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
26170 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
26180 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
26190 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
261a0 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
261b0 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
261c0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
261d0 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
261e0 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
261f0 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
26200 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
26210 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
26220 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
26230 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
26240 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
26250 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
26260 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
26270 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
26280 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26290 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
262a0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
262b0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
262c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
262d0 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
262e0 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
262f0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
26300 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
26310 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
26320 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
26330 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
26340 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
26350 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
26360 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26380 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
26390 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
263a0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
263b0 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
263c0 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
263d0 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
263e0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
263f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
26400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26410 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
26420 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
26430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26440 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
26450 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
26460 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
26470 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
26480 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
26490 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
264a0 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
264b0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
264c0 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
264d0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
264e0 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
264f0 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
26500 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
26510 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
26520 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
26530 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
26540 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
26550 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26560 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
26570 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
26580 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
26590 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
265a0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
265b0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
265c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
265d0 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69  re the first wri
265e0 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53  te, give the VFS
265f0 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20   a hint of what 
26600 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66  the final.  ** f
26610 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  ile size will be
26620 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
26630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
26640 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
26650 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63  >fd) );.  if( rc
26660 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
26670 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50  Pager->dbSize>pP
26680 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
26690 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
266a0 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
266b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
266c0 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
266d0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
266e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
266f0 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72  leControl(pPager
26700 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
26710 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
26720 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67  zFile);.    pPag
26730 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
26740 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
26750 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
26760 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26770 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
26780 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
26790 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
267a0 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
267b0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
267c0 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
267d0 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
267e0 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
267f0 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
26800 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
26810 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
26820 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
26830 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
26840 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
26850 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
26860 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
26870 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
26880 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
26890 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
268a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
268b0 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
268c0 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
268d0 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
268e0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
268f0 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
26900 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
26910 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
26920 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
26930 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
26940 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
26950 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
26960 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
26970 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
26980 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
26990 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
269a0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
269b0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
269c0 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
269f0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
26a00 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72     ..      asser
26a10 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  t( (pList->flags
26a20 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
26a30 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f  )==0 );..      /
26a40 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
26a50 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
26a60 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
26a70 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
26a80 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
26a90 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29  TE_NOMEM, pData)
26aa0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
26ab0 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
26ac0 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
26ad0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
26ae0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
26af0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
26b00 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
26b10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
26b20 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
26b30 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
26b40 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
26b50 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
26b60 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
26b70 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
26b80 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
26b90 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
26ba0 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
26bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26bc0 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
26bd0 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
26be0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
26bf0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
26c00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
26c10 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
26c20 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
26c30 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
26c40 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
26c50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
26c60 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
26c70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
26c80 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
26c90 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
26ca0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   }..      /* Upd
26cb0 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
26cc0 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
26cd0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
26ce0 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
26cf0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
26d00 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
26d10 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
26d20 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
26d30 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
26d40 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
26d50 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
26d60 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
26d70 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
26d80 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
26d90 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
26da0 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
26db0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
26dc0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
26dd0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
26de0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
26df0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
26e00 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50  _count);.      P
26e10 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
26e20 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d  ->nWrite);.    }
26e30 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
26e40 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45  RTRACE(("NOSTORE
26e50 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
26e60 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
26e70 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20   pgno));.    }. 
26e80 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
26e90 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20  ehash(pList);.  
26ea0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
26eb0 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20  >pDirty;.  }..  
26ec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
26ed0 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
26ee0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
26ef0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66  file is open. If
26f00 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
26f10 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  pen, this .** fu
26f20 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
26f30 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
26f40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
26f50 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
26f60 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  s according to p
26f70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49  lan. An .** SQLI
26f80 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
26f90 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
26fa0 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ned if a call to
26fb0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
26fc0 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73   .** fails..*/.s
26fd0 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
26fe0 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
26ff0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
27000 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27010 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
27020 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
27030 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
27040 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
27050 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
27060 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
27070 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
27080 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
27090 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
270a0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
270b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
270c0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
270d0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
270e0 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
270f0 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
27100 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
27110 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
27120 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20  end a record of 
27130 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
27140 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f  e of page pPg to
27150 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27160 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  . .** It is the 
27170 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
27180 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75  bility to use su
27190 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
271a0 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68   to check .** th
271b0 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  at it is really 
271c0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
271d0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
271e0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
271f0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
27200 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
27210 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
27220 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
27230 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
27240 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
27250 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
27260 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
27270 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
27280 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
27290 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
272a0 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
272b0 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
272c0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
272d0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
272e0 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
272f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
27300 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
27310 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
27320 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
27330 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
27340 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
27350 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
27360 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
27370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
27380 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
27390 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
273a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
273b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
273c0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a  NALMODE_OFF ){..
273d0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
273e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
273f0 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
27400 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a  dy been opened *
27410 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
27420 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
27430 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27440 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27450 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57  fd) || pagerUseW
27460 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
27470 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
27480 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
27490 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  | pPager->nSubRe
274a0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
274b0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
274c0 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
274d0 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e    || pageInJourn
274e0 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20 20  al(pPg) .       
274f0 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
27500 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
27510 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
27520 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
27530 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
27540 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
27550 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
27560 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
27570 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
27580 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
27590 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
275a0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
275b0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
275c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
275d0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
275e0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
275f0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
27600 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  t = pPager->nSub
27610 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
27620 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
27630 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
27640 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
27650 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
27660 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
27670 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
27680 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50  pData2);.      P
27690 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54  AGERTRACE(("STMT
276a0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
276b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
276c0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
276d0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  no));.      rc =
276e0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
276f0 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
27700 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
27710 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27720 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27740 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
27750 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
27760 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
27770 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d  fset+4);.      }
27780 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
27790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
277a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
277b0 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
277c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
277d0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
277e0 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
277f0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
27800 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
27810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
27830 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
27840 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
27850 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
27860 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
27870 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
27880 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
27890 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
278a0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
278b0 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
278c0 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
278d0 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
278e0 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
278f0 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
27900 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
27910 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27920 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
27930 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
27940 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
27950 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
27960 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
27970 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
27980 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
27990 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
279a0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
279b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
279c0 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
279d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
279e0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
279f0 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
27a00 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
27a10 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
27a20 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
27a30 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
27a40 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
27a50 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
27a60 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
27a70 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
27a80 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
27a90 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
27aa0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
27ab0 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
27ac0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
27ad0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
27ae0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
27af0 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
27b00 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
27b10 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
27b20 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
27b30 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
27b40 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
27b50 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
27b60 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
27b70 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
27b80 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
27b90 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
27ba0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
27bb0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
27bc0 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
27bd0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
27be0 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
27bf0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
27c00 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
27c10 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
27c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27c30 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
27c40 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
27c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
27c60 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
27c70 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
27c80 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66  doNotSyncSpill f
27c90 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69 6e  lag is set durin
27ca0 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
27cb0 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
27cc0 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
27cd0 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
27ce0 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
27cf0 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
27d00 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
27d10 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
27d20 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
27d30 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
27d40 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
27d50 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
27d60 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
27d70 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
27d80 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  e doNotSpill fla
27d90 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  g inhibits all c
27da0 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65  ache spilling re
27db0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
27dc0 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20  her.  ** or not 
27dd0 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
27de0 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
27df0 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
27e00 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ck..  **.  ** Sp
27e10 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
27e20 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
27e30 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
27e40 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
27e50 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
27e60 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
27e70 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
27e80 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
27e90 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69  on it .  ** is i
27ea0 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71  mpossible for sq
27eb0 6c 69 74 65 33 50 43 61 63 68 65 46 65 74 63 68  lite3PCacheFetch
27ec0 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  () to be called 
27ed0 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
27ee0 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e  =1.  ** while in
27ef0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
27f00 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d  , hence it is im
27f10 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
27f20 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a  s routine to.  *
27f30 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74  * be called in t
27f40 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
27f50 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77   Nevertheless, w
27f60 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45  e include a NEVE
27f70 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f  R().  ** test fo
27f80 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
27f90 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64  e as a safeguard
27fa0 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20   against future 
27fb0 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  changes..  */.  
27fc0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
27fd0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
27fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27ff0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
28000 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e  otSpill ) return
28010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
28020 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
28030 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67  yncSpill && (pPg
28040 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
28050 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b  NEED_SYNC)!=0 ){
28060 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28070 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50  TE_OK;.  }..  pP
28080 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
28090 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
280a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
280b0 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c  /* Write a singl
280c0 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73  e frame for this
280d0 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67   page to the log
280e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62  . */.    if( sub
280f0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
28100 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20  g) ){ .      rc 
28110 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
28120 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20  (pPg); .    }.  
28130 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28140 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
28150 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
28160 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c  (pPager, pPg, 0,
28170 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
28180 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a  }else{.  .    /*
28190 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
281a0 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72  l file if requir
281b0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
281c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
281d0 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20  NEED_SYNC .     
281e0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
281f0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
28200 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a  CACHEMOD.    ){.
28210 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
28220 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31  ournal(pPager, 1
28230 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
28240 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
28250 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61  umber of this pa
28260 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ge is larger tha
28270 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  n the current si
28280 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ze of.    ** the
28290 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
282a0 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20   it may need to 
282b0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
282c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  e sub-journal.. 
282d0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
282e0 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74  cause the call t
282f0 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  o pager_write_pa
28300 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77  gelist() below w
28310 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61  ill not.    ** a
28320 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20 64 61  ctually write da
28330 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 20 69  ta to the file i
28340 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
28350 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69   **.    ** Consi
28360 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
28370 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
28380 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ents:.    **.   
28390 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   **   BEGIN;.   
283a0 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
283b0 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
283c0 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65      <modify page
283d0 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   X>.    **     S
283e0 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20  AVEPOINT sp;.   
283f0 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72 69 6e   **       <shrin
28400 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
28410 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20 20 20  to Y pages>.    
28420 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72 53 74  **       pagerSt
28430 72 65 73 73 28 70 61 67 65 20 58 29 0a 20 20 20  ress(page X).   
28440 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
28450 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20   TO sp;.    **. 
28460 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20     ** If (X>Y), 
28470 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53  then when pagerS
28480 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20  tress is called 
28490 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20  page X will not 
284a0 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20 20 2a  be written.    *
284b0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
284c0 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20  abase file, but 
284d0 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20  will be dropped 
284e0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20  from the cache. 
284f0 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c  Then,.    ** fol
28500 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c  lowing the "ROLL
28510 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74  BACK TO sp" stat
28520 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70  ement, reading p
28530 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a  age X will read.
28540 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d      ** data from
28550 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28560 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65  le. This will be
28570 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67   the copy of pag
28580 65 20 58 20 61 73 20 69 74 0a 20 20 20 20 2a 2a  e X as it.    **
28590 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 74 72   was when the tr
285a0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
285b0 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77 61 73  d, not as it was
285c0 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49 4e 54   when "SAVEPOINT
285d0 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61 73 20   sp".    ** was 
285e0 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a  executed..    **
285f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
28600 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65  tion is to write
28610 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
28620 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74  a for page X int
28630 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 75  o the .    ** su
28640 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  b-journal file n
28650 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  ow (if it is not
28660 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c   already there),
28670 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
28680 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73 74 6f  .    ** be resto
28690 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65  red to its curre
286a0 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  nt value when th
286b0 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
286c0 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20 65 78  p" is .    ** ex
286d0 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ecuted..    */. 
286e0 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a 20 20     if( NEVER(.  
286f0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
28700 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f  _OK && pPg->pgno
28710 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
28720 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
28730 61 67 65 28 70 50 67 29 0a 20 20 20 20 29 20 29  age(pPg).    ) )
28740 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75 62  {.      rc = sub
28750 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
28760 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
28770 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
28780 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
28790 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
287a0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
287b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
287c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
287d0 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
287e0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
287f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )==0 );.      rc
28800 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
28810 61 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20  agelist(pPager, 
28820 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
28830 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
28840 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f  age as clean. */
28850 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45  E_OK ){.    PAGE
28870 52 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20  RTRACE(("STRESS 
28880 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
28890 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
288a0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
288b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
288c0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
288d0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  }..  return page
288e0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
288f0 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rc); .}.../*.** 
28900 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
28910 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61  tialize a new Pa
28920 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70  ger object and p
28930 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
28940 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65  it.** in *ppPage
28950 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68 6f  r. The pager sho
28960 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62  uld eventually b
28970 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73 69  e freed by passi
28980 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69  ng it.** to sqli
28990 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e  te3PagerClose().
289a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
289b0 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
289c0 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65   the path to the
289d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
289e0 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46  o open..** If zF
289f0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
28a00 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
28a10 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
28a20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
28a30 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
28a40 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
28a50 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20  ched. Temporary 
28a60 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c  files are be del
28a70 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
28a80 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20  cally when they 
28a90 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a  are closed. If z
28aa0 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
28ab0 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20  mory:" then .** 
28ac0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
28ad0 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
28ae0 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  . It is never wr
28af0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a  itten to disk. .
28b00 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  ** This can be u
28b10 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
28b20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
28b30 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
28b40 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74  e nExtra paramet
28b50 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68 65  er specifies the
28b60 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
28b70 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
28b80 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
28b90 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66 65  h each page refe
28ba0 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63  rence. This spac
28bb0 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74  e is available t
28bc0 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69  o the user.** vi
28bd0 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  a the sqlite3Pag
28be0 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50 49  erGetExtra() API
28bf0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
28c00 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
28c10 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
28c20 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
28c30 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
28c40 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
28c50 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
28c60 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
28c70 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
28c80 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
28c90 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e  _OMIT_JOURNAL an
28ca0 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  d PAGER_NO_READL
28cb0 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a  OCK flags..**.**
28cc0 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61   The vfsFlags pa
28cd0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
28ce0 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20  mask to pass to 
28cf0 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
28d00 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f  ter.** of the xO
28d10 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  pen() method of 
28d20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53  the supplied VFS
28d30 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69   when opening fi
28d40 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  les. .**.** If t
28d50 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
28d60 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
28d70 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
28d80 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73  ile opened .** s
28d90 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c  uccessfully, SQL
28da0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
28db0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20  ed and *ppPager 
28dc0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
28dd0 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72  ** the new pager
28de0 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65   object. If an e
28df0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
28e00 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20  Pager is set to 
28e10 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f  NULL.** and erro
28e20 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
28e30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
28e40 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
28e50 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74  _NOMEM.** (sqlit
28e60 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73  e3Malloc() is us
28e70 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ed to allocate m
28e80 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43  emory), SQLITE_C
28e90 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76  ANTOPEN or .** v
28ea0 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f  arious SQLITE_IO
28eb0 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a  _XXX errors..*/.
28ec0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28ed0 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
28ee0 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
28ef0 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
28f00 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75  file system to u
28f10 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a  se */.  Pager **
28f20 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  ppPager,        
28f30 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20   /* OUT: Return 
28f40 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
28f50 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
28f60 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
28f70 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
28f80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
28f90 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
28fa0 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
28fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
28fc0 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
28fd0 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
28fe0 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
28ff0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
29000 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
29010 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
29020 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ile */.  int vfs
29030 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
29040 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65    /* flags passe
29050 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
29060 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
29070 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
29080 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f  init)(DbPage*) /
29090 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65  * Function to re
290a0 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73  initialize pages
290b0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74   */.){.  u8 *pPt
290c0 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r;.  Pager *pPag
290d0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
290e0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   Pager object to
290f0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   allocate and re
29100 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  turn */.  int rc
29110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
29120 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
29130 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46  e */.  int tempF
29140 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
29150 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70  /* True for temp
29160 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e   files (incl. in
29170 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a  -memory files) *
29180 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  /.  int memDb = 
29190 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
291a0 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
291b0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  an in-memory fil
291c0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f  e */.  int readO
291d0 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nly = 0;        
291e0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
291f0 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66  is a read-only f
29200 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75  ile */.  int jou
29210 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20  rnalFileSize;   
29220 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
29230 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68 20  locate for each 
29240 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20  journal fd */.  
29250 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20  char *zPathname 
29260 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c  = 0;     /* Full
29270 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   path to databas
29280 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
29290 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20  nPathname = 0;  
292a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
292b0 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68  f bytes in zPath
292c0 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  name */.  int us
292d0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
292e0 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
292f0 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46  OURNAL)==0; /* F
29300 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75  alse to omit jou
29310 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  rnal */.  int no
29320 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
29330 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
29340 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54  DLOCK)!=0;  /* T
29350 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64  rue to omit read
29360 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70  -lock */.  int p
29370 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
29380 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
29390 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
293a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
293b0 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
293c0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
293d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
293e0 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
293f0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
29400 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
29410 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
29420 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
29430 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
29440 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
29450 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
29460 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
29470 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
29480 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69  ub-journal). Thi
29490 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61  s.  ** is the ma
294a0 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
294b0 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d  ired for an in-m
294c0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
294d0 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20  le handle .  ** 
294e0 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f  and a regular jo
294f0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
29500 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22  e. Note that a "
29510 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d  regular journal-
29520 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79  handle".  ** may
29530 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63 61   be a wrapper ca
29540 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67  pable of caching
29550 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74 69   the first porti
29560 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
29570 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d  l.  ** file in m
29580 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65  emory to impleme
29590 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  nt the atomic-wr
295a0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
295b0 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72   (see .  ** sour
295c0 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e  ce file journal.
295d0 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  c)..  */.  if( s
295e0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
295f0 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
29600 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
29610 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
29620 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
29630 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
29640 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c  ze(pVfs));.  }el
29650 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
29660 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38  ileSize = ROUND8
29670 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  (sqlite3MemJourn
29680 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a  alSize());.  }..
29690 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
296a0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
296b0 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20  NULL in case an 
296c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
296d0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
296e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
296f0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
29700 20 69 66 28 20 66 6c 61 67 73 20 26 20 50 41 47   if( flags & PAG
29710 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  ER_MEMORY ){.   
29720 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
29730 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
29740 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
29750 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
29760 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
29770 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
29780 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
29790 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
297a0 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
297b0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
297c0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
297d0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
297e0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
297f0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
29800 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
29810 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
29820 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
29830 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
29840 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
29850 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
29860 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
29870 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
29880 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
29890 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
298a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
298b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
298c0 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
298d0 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
298e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
298f0 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
29900 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
29910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29920 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
29930 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
29940 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
29950 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
29960 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
29970 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
29980 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
29990 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e  ITE_OK && nPathn
299a0 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61  ame+8>pVfs->mxPa
299b0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
299c0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
299d0 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65  s taken when the
299e0 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65   journal path re
299f0 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
29a00 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
29a10 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c  being opened wil
29a20 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70  l be more than p
29a30 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a  Vfs->mxPathname.
29a40 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69        ** bytes i
29a50 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d  n length. This m
29a60 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
29a70 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  e cannot be open
29a80 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ed,.      ** as 
29a90 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
29aa0 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20  ossible to open 
29ab0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29ac0 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a   or even.      *
29ad0 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f  * check for a ho
29ae0 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  t-journal before
29af0 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20   reading..      
29b00 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
29b10 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
29b20 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
29b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29b40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29b50 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
29b60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
29b70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
29b80 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
29b90 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
29ba0 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
29bb0 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
29bc0 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
29bd0 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
29be0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
29bf0 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
29c00 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
29c10 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
29c20 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
29c30 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
29c40 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
29c50 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
29c60 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
29c70 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
29c80 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
29c90 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
29ca0 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
29cb0 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
29cc0 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
29cd0 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
29ce0 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
29cf0 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
29d00 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
29d10 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
29d20 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
29d30 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
29d40 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
29d50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
29d60 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
29d70 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
29d80 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
29d90 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
29da0 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
29db0 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
29dc0 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
29dd0 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
29de0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
29df0 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
29e00 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
29e10 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
29e20 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
29e30 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
29e40 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
29e50 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
29e60 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
29e70 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
29e80 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
29e90 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
29ea0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
29eb0 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
29ec0 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
29ed0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
29ee0 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
29ef0 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
29f00 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
29f10 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
29f20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
29f30 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
29f40 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
29f50 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20   + 8 + 1        
29f60 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
29f70 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  l */.#ifndef SQL
29f80 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
29f90 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34   + nPathname + 4
29fa0 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20 20   + 1            
29fb0 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
29fc0 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
29fd0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
29fe0 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
29ff0 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2a000 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2a010 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2a020 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a030 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
2a040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a050 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
2a060 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
2a070 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
2a080 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
2a090 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
2a0a0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2a0b0 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2a0c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
2a0d0 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
2a0e0 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2a0f0 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
2a100 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
2a110 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
2a120 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2a130 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2a140 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
2a150 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
2a160 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
2a170 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2a180 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2a190 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
2a1a0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2a1b0 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
2a1c0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2a1d0 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
2a1e0 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
2a1f0 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
2a200 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
2a210 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
2a220 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
2a230 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
2a240 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  hname ){.    ass
2a250 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30  ert( nPathname>0
2a260 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2a270 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
2a280 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
2a290 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a 20 20 20  thname + 1);.   
2a2a0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2a2b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2a2c0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2a2d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2a2e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
2a2f0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2a300 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2a310 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
2a320 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2a330 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29 3b 0a 23  -journal", 8);.#
2a340 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2a350 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65  IT_WAL.    pPage
2a360 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65  r->zWal = &pPage
2a370 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
2a380 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20  hname+8+1];.    
2a390 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2a3a0 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  Wal, zPathname, 
2a3b0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2a3c0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2a3d0 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  zWal[nPathname],
2a3e0 20 22 2d 77 61 6c 22 2c 20 34 29 3b 0a 23 65 6e   "-wal", 4);.#en
2a3f0 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
2a400 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
2a410 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2a420 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2a430 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2a440 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2a450 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2a460 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2a470 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2a480 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2a490 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2a4c0 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2a4d0 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2a4e0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2a4f0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2a500 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2a510 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2a520 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2a530 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2a540 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2a550 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2a560 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2a570 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2a580 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2a590 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2a5a0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2a5b0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2a5c0 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2a5d0 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2a5e0 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2a5f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2a600 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2a610 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2a620 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2a630 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2a640 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2a650 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2a660 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2a670 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2a680 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2a690 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2a6a0 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2a6b0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2a6c0 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2a6d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2a6e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a6f0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2a700 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
2a710 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2a720 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2a730 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2a740 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2a750 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2a760 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2a770 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2a780 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2a790 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2a7a0 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
2a7b0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2a7c0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
2a7d0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2a7e0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2a7f0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2a800 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2a810 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2a820 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2a830 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2a840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a850 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2a860 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2a870 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
2a880 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2a890 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2a8a0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2a8b0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
2a8c0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
2a8d0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2a8e0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2a8f0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2a900 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2a910 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2a920 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2a930 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2a940 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2a950 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2a960 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
2a970 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2a980 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2a990 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2a9a0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2a9b0 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
2a9c0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2a9d0 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
2a9e0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2a9f0 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2aa00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2aa10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2aa20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2aa30 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2aa40 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2aa50 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2aa60 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2aa70 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2aa80 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2aa90 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2aaa0 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2aab0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2aac0 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2aad0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2aae0 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2aaf0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2ab00 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2ab10 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2ab20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2ab30 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2ab40 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2ab50 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2ab60 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2ab70 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2ab80 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2ab90 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2aba0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2abb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2abc0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
2abd0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2abe0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2abf0 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
2ac00 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2ac10 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2ac20 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2ac30 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2ac40 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2ac50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2ac60 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2ac70 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2ac80 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2ac90 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2aca0 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2acb0 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2acc0 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2acd0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2ace0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2acf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ad00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ad10 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2ad20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ad30 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2ad40 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2ad50 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2ad60 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2ad70 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2ad80 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2ad90 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  urred in either 
2ada0 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
2adb0 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20  ove, free the . 
2adc0 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   ** Pager struct
2add0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2ade0 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2adf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ae00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2ae10 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
2ae20 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ce );.    sqlite
2ae30 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2ae40 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2ae50 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2ae60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ae70 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2ae80 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2ae90 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65  bject. */.  asse
2aea0 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2aeb0 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  );.  nExtra = RO
2aec0 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
2aed0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2aee0 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2aef0 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af10 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2af20 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2af30 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2af40 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47  pPCache);..  PAG
2af50 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2af60 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2af70 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2af80 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2af90 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2afa0 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2afb0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2afc0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2afd0 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2afe0 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2aff0 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
2b000 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e  >noReadlock = (n
2b010 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
2b020 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f  dOnly) ?1:0;.  /
2b030 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
2b040 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
2b050 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
2b060 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2b070 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
2b080 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2b090 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
2b0a0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2b0b0 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
2b0c0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
2b0d0 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
2b0e0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
2b0f0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
2b100 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
2b110 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2b120 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20  _UNLOCK; */.#if 
2b130 30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  0.  assert( pPag
2b140 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
2b150 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
2b160 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
2b170 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64  _UNLOCK) );.#end
2b180 69 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  if.  /* pPager->
2b190 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
2b1a0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
2b1b0 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  le = (u8)tempFil
2b1c0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
2b1d0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2b1e0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
2b1f0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
2b200 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
2b210 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
2b220 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
2b230 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
2b240 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
2b250 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
2b260 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
2b270 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50  )tempFile; .  pP
2b280 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
2b290 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
2b2a0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2b2b0 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
2b2c0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
2b2d0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
2b2e0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65  readOnly;.  asse
2b2f0 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  rt( useJournal |
2b300 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
2b310 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le );.  pPager->
2b320 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  noSync = pPager-
2b330 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
2b340 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
2b350 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
2b360 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  0:1;.  pPager->s
2b370 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49  ync_flags = SQLI
2b380 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
2b390 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2b3a0 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2b3b0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2b3c0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2b3d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2b3e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2b3f0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2b400 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2b410 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2b420 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2b430 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2b440 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2b450 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2b460 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2b470 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2b480 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2b490 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2b4a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2b4b0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2b4c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2b4d0 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2b4e0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2b4f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2b500 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2b510 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2b520 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2b530 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2b540 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2b550 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2b560 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2b570 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2b580 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
2b590 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2b5a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
2b5b0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
2b5c0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
2b5d0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
2b5e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
2b5f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2b600 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
2b610 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67  er transitioning
2b620 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f   from PAGER_UNLO
2b630 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53  CK to.** PAGER_S
2b640 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74 20  HARED state. It 
2b650 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20 69  tests if there i
2b660 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
2b670 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2b680 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
2b690 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
2b6a0 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  r. A hot journal
2b6b0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a   is one that .**
2b6c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
2b6d0 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64  yed back. Accord
2b6e0 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ing to this func
2b6f0 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72  tion, a hot-jour
2b700 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73  nal.** file exis
2b710 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ts if the follow
2b720 69 6e 67 20 63 72 69 74 65 72 69 61 20 61 72 65  ing criteria are
2b730 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   met:.**.**   * 
2b740 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2b750 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2b760 69 6c 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a  ile system, and.
2b770 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73  **   * No proces
2b780 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2b790 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2b7a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2b7b0 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20  se file, and.** 
2b7c0 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2b7d0 20 66 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20   file itself is 
2b7e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 62  greater than 0 b
2b7f0 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e  ytes in size, an
2b800 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72  d.**   * The fir
2b810 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a  st byte of the j
2b820 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2b830 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78  ts and is not 0x
2b840 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  00..**.** If the
2b850 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
2b860 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b870 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
2b880 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
2b890 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
2b8a0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
2b8b0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
2b8c0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
2b8d0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
2b8e0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20  e same name. In 
2b8f0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
2b900 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
2b910 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75 73   just deleted us
2b920 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70  ing OsDelete, *p
2b930 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
2b940 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
2b950 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
2b960 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2b970 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65  ine does not che
2b980 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ck if there is a
2b990 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2b9a0 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74  filename.** at t
2b9b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
2b9c0 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c  le. If there is,
2b9d0 20 61 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72   and that master
2b9e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2b9f0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
2ba00 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
2ba10 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
2ba20 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69  ally hot. In thi
2ba30 73 0a 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72  s.** case this r
2ba40 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
2ba50 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  rn a false-posit
2ba60 69 76 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70  ive. The pager_p
2ba70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75  layback().** rou
2ba80 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76  tine will discov
2ba90 65 72 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  er that the jour
2baa0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2bab0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a  really hot and .
2bac0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
2bad0 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a   it back. .**.**
2bae0 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   If a hot-journa
2baf0 6c 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20  l file is found 
2bb00 74 6f 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73  to exist, *pExis
2bb10 74 73 20 69 73 20 73 65 74 20 74 6f 20 31 20 61  ts is set to 1 a
2bb20 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  nd .** SQLITE_OK
2bb30 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
2bb40 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2bb50 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70  e is present, *p
2bb60 45 78 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74  Exists is.** set
2bb70 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2bb80 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2bb90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2bba0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
2bbb0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
2bbc0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2bbd0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2bbe0 6c 65 20 65 78 69 73 74 73 2c 20 74 68 65 20 49  le exists, the I
2bbf0 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  O error.** code 
2bc00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2bc10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45  the value of *pE
2bc20 78 69 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e  xists is undefin
2bc30 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2bc40 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
2bc50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
2bc60 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20  nt *pExists){.  
2bc70 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
2bc80 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
2bc90 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
2bca0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2bcb0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2bcc0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2bcd0 20 65 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20   exists = 1;    
2bce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2bcf0 75 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20  ue if a journal 
2bd00 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20  file is present 
2bd10 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65  */.  int jrnlOpe
2bd20 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61  n = !!isOpen(pPa
2bd30 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73  ger->jfd);..  as
2bd40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
2bd50 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
2bd60 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2bd70 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73  ger->fd) );.  as
2bd80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2bd90 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2bda0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a   );..  assert( j
2bdb0 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20  rnlOpen==0 || ( 
2bdc0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2bdd0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2bde0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20  Pager->jfd) &.  
2bdf0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
2be00 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
2be10 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70  OPEN.  ));..  *p
2be20 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66  Exists = 0;.  if
2be30 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
2be40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2be50 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
2be60 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2be70 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2be80 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
2be90 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2bea0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
2beb0 73 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  s ){.    int loc
2bec0 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
2bed0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2bee0 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c  some process hol
2bef0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  ds a RESERVED lo
2bf00 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61  ck */..    /* Ra
2bf10 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72  ce condition her
2bf20 65 3a 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63  e:  Another proc
2bf30 65 73 73 20 6d 69 67 68 74 20 68 61 76 65 20 62  ess might have b
2bf40 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a  een holding the.
2bf50 20 20 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52      ** the RESER
2bf60 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76  VED lock and hav
2bf70 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e  e a journal open
2bf80 20 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f   at the sqlite3O
2bf90 73 41 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a  sAccess() .    *
2bfa0 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75  * call above, bu
2bfb0 74 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68  t then delete th
2bfc0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72  e journal and dr
2bfd0 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f  op the lock befo
2bfe0 72 65 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74  re.    ** we get
2bff0 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2c000 67 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  g sqlite3OsCheck
2c010 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63  ReservedLock() c
2c020 61 6c 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20  all.  If that.  
2c030 20 20 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65    ** is the case
2c040 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
2c050 69 67 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65  ight think there
2c060 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
2c070 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e  l when.    ** in
2c080 20 66 61 63 74 20 74 68 65 72 65 20 69 73 20 6e   fact there is n
2c090 6f 6e 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c  one.  This resul
2c0a0 74 73 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f  ts in a false-po
2c0b0 73 69 74 69 76 65 20 77 68 69 63 68 20 77 69 6c  sitive which wil
2c0c0 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c  l.    ** be deal
2c0d0 74 20 77 69 74 68 20 62 79 20 74 68 65 20 70 6c  t with by the pl
2c0e0 61 79 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20  ayback routine. 
2c0f0 20 54 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20   Ticket #3883.. 
2c100 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2c110 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
2c120 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
2c130 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
2c140 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2c150 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64  TE_OK && !locked
2c160 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   ){.      Pgno n
2c170 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2c180 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c190 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
2c1a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
2c1b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65      /* Check the
2c1c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2c1d0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69  abase file. If i
2c1e0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20  t consists of 0 
2c1f0 70 61 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20  pages,.      ** 
2c200 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
2c210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65  journal file. Se
2c220 65 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  e the header com
2c230 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a  ment above for .
2c240 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61        ** the rea
2c250 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65  soning here.  De
2c260 6c 65 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74  lete the obsolet
2c270 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75  e journal file u
2c280 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20  nder.      ** a 
2c290 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
2c2a0 20 61 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64   avoid race cond
2c2b0 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76  itions and to av
2c2c0 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20  oid violating.  
2c2d0 20 20 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e      ** [H33020].
2c2e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c2f0 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
2c300 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
2c310 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2c320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c330 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 67          if( nPag
2c340 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2c350 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
2c360 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
2c370 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
2c380 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
2c390 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
2c3a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c3b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c3c0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
2c3d0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2c3e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2c3f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
2c400 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
2c410 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
2c420 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2c430 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2c440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2c450 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
2c460 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2c470 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2c480 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2c490 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
2c4a0 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
2c4b0 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
2c4c0 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
2c4d0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2c4e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2c4f0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
2c500 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
2c510 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
2c520 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
2c530 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2c540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c550 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
2c560 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
2c570 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
2c580 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
2c590 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
2c5a0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
2c5b0 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
2c5c0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2c5d0 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2c5e0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2c5f0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
2c600 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
2c610 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2c620 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
2c630 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c640 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2c650 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2c660 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
2c670 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
2c680 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2c690 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c6a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
2c6b0 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
2c6c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2c6d0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
2c6e0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
2c6f0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
2c700 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2c710 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
2c720 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
2c730 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2c740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2c750 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c760 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
2c770 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
2c780 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2c790 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
2c7a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2c7b0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
2c7c0 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
2c7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2c7e0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2c7f0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
2c800 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
2c810 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
2c820 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
2c830 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
2c840 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
2c850 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68 61         ** its ha
2c860 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
2c870 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
2c880 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
2c890 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
2c8a0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
2c8b0 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
2c8c0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
2c8d0 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
2c8e0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
2c8f0 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
2c900 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
2c910 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
2c920 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
2c930 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
2c940 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
2c950 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
2c960 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
2c970 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
2c980 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
2c990 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
2c9a0 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
2c9b0 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
2c9c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
2c9d0 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
2c9e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
2c9f0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
2ca00 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
2ca10 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
2ca20 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
2ca30 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
2ca40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2ca50 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
2ca60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2ca70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2ca80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ca90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2caa0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2cab0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2cac0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2cad0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
2cae0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
2caf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2cb00 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
2cb10 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
2cb20 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
2cb30 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
2cb40 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
2cb50 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
2cb60 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
2cb70 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
2cb80 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
2cb90 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
2cba0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
2cbb0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
2cbc0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2cbd0 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
2cbe0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
2cbf0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2cc00 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
2cc10 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
2cc20 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
2cc30 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
2cc40 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
2cc50 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2cc60 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
2cc70 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
2cc80 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
2cc90 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
2cca0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2ccb0 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
2ccc0 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
2ccd0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
2cce0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
2ccf0 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
2cd00 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
2cd10 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
2cd20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
2cd30 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
2cd40 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
2cd50 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
2cd60 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
2cd70 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cd80 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
2cd90 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
2cda0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
2cdb0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
2cdc0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
2cdd0 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
2cde0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
2cdf0 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
2ce00 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
2ce10 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
2ce20 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
2ce30 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
2ce40 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
2ce50 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
2ce60 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
2ce70 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2ce80 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
2ce90 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
2cea0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2ceb0 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
2cec0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
2ced0 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
2cee0 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
2cef0 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
2cf00 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2cf10 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
2cf20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
2cf30 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
2cf40 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
2cf50 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
2cf60 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2cf70 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
2cf80 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2cf90 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
2cfa0 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
2cfb0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
2cfc0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
2cfd0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
2cfe0 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
2cff0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
2d000 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
2d010 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2d020 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2d030 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
2d040 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2d050 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d060 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d070 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d080 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
2d090 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
2d0a0 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
2d0b0 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
2d0c0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2d0d0 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
2d0e0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
2d0f0 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
2d100 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
2d110 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
2d120 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
2d130 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
2d140 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
2d150 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
2d160 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
2d170 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
2d180 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
2d190 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2d1a0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2d1b0 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
2d1c0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2d1d0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2d1e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2d1f0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2d200 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
2d210 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
2d220 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
2d230 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
2d240 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d250 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
2d260 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
2d270 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
2d280 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
2d290 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
2d2a0 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
2d2b0 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
2d2c0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
2d2d0 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
2d2e0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
2d2f0 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
2d300 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
2d310 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2d320 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
2d330 6b 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  k==0 || pPager->
2d340 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 20 20 20  readOnly );..   
2d350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 52   if( pPager->noR
2d360 65 61 64 6c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  eadlock==0 ){.  
2d370 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2d380 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
2d390 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
2d3a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d3b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d3c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2d3d0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
2d3e0 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
2d3f0 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
2d400 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  CK );.        go
2d410 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2d420 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2d430 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
2d440 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
2d450 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
2d460 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
2d470 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2d480 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
2d490 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
2d4a0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
2d4b0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
2d4c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2d4d0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
2d4e0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
2d4f0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
2d500 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
2d510 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
2d520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d530 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2d540 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
2d550 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
2d560 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
2d570 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
2d580 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2d590 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
2d5a0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
2d5b0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
2d5c0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
2d5d0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
2d5e0 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
2d5f0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
2d600 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
2d610 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
2d620 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
2d630 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
2d640 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2d650 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
2d660 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
2d670 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
2d680 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
2d690 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
2d6a0 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
2d6b0 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
2d6c0 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20  l rolling the . 
2d6d0 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72       ** hot-jour
2d6e0 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20  nal back..      
2d6f0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63  ** .      ** Bec
2d700 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
2d710 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
2d720 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
2d730 73 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20  sted, any.      
2d740 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ** other process
2d750 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61   attempting to a
2d760 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
2d770 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74  se file will get
2d780 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68   to .      ** th
2d790 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
2d7a0 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
2d7b0 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
2d7c0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a  EXCLUSIVE lock .
2d7d0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
2d7e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
2d7f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2d800 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
2d810 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  r is in locking_
2d820 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d  mode=exclusive m
2d830 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ode, the lock is
2d840 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72  .      ** downgr
2d850 61 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c  aded to SHARED_L
2d860 4f 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20  OCK before this 
2d870 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2d880 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d890 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
2d8a0 62 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  b(pPager, EXCLUS
2d8b0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
2d8c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d8d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2d8e0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
2d8f0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66   }. .      /* If
2d900 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
2d910 64 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  dy open and the 
2d920 66 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64  file exists on d
2d930 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20  isk, open the . 
2d940 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
2d950 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2d960 63 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63  ccess. Write acc
2d970 65 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20  ess is required 
2d980 62 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a  because .      *
2d990 2a 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  * in exclusive-a
2d9a0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
2d9b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2d9c0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
2d9d0 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70   .      ** and p
2d9e0 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
2d9f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
2da00 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77  ater on. Also, w
2da10 72 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20  rite-access .   
2da20 20 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79     ** is usually
2da30 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e   required to fin
2da40 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2da50 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  l in journal_mod
2da60 65 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20  e=persist .     
2da70 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c   ** mode (and al
2da80 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d  so for journal_m
2da90 6f 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20  ode=truncate on 
2daa0 73 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20  some systems).. 
2dab0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2dac0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2dad0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
2dae0 69 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73  it usually means
2daf0 20 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20   that some .    
2db00 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
2db10 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f  ction managed to
2db20 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c   get in and roll
2db30 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20   it back before 
2db40 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63  .      ** this c
2db50 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
2db60 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
2db70 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
2db80 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61   it .      ** ma
2db90 79 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20  y mean that the 
2dba0 70 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65  pager was in the
2dbb0 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
2dbc0 6e 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  n this.      ** 
2dbd0 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2dbe0 6c 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  led and the jour
2dbf0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
2dc00 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a  t exist..      *
2dc10 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
2dc20 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2dc30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2dc40 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2dc50 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2dc60 56 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Vfs;.        int
2dc70 20 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20   bExists;       
2dc80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2dc90 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  f journal file e
2dca0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
2dcb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
2dcc0 63 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20  ccess(.         
2dcd0 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
2dce0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2dcf0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2dd00 20 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20   &bExists);.    
2dd10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2dd20 54 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73  TE_OK && bExists
2dd30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2dd40 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20  t fout = 0;.    
2dd50 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
2dd60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2dd70 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
2dd80 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
2dd90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2dda0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2ddb0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e );.          r
2ddc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2ddd0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2dde0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
2ddf0 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
2de00 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2de10 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
2de20 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
2de30 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
2de40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2de50 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
2de60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2de70 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
2de80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2de90 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2dea0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2deb0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
2dec0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
2ded0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2dee0 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
2def0 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
2df00 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2df10 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
2df20 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
2df30 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
2df40 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
2df50 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20  lock. Purge the 
2df60 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20  cache before.   
2df70 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61     ** playing ba
2df80 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e  ck the hot-journ
2df90 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f  al so that we do
2dfa0 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a  n't end up with.
2dfb0 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f        ** an inco
2dfc0 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
2dfd0 20 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f   Sync the hot jo
2dfe0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
2dff0 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74  ying.      ** it
2e000 20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20   back since the 
2e010 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61  process that cra
2e020 73 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68  shed and left th
2e030 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  e hot journal.  
2e040 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
2e050 64 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20  did not sync it 
2e060 61 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69  and we are requi
2e070 72 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79  red to always sy
2e080 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nc.      ** the 
2e090 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70  journal before p
2e0a0 6c 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a  laying it back..
2e0b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2e0c0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2e0d0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2e0e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2e0f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2e100 20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e     rc = pagerSyn
2e110 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
2e120 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
2e130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e140 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2e150 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2e160 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
2e170 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53        pPager->eS
2e180 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45  tate = PAGER_OPE
2e190 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  N;.        }.   
2e1a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
2e1b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2e1c0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ode ){.        p
2e1d0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
2e1e0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
2e1f0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2e200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
2e220 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2e230 20 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72   taken if an err
2e240 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2e250 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20  trying to open. 
2e260 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c         ** or rol
2e270 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  l back a hot-jou
2e280 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69  rnal while holdi
2e290 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
2e2a0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
2e2b0 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    ** pager_unloc
2e2c0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
2e2d0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
2e2e0 65 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75  e returning to u
2e2f0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a  nlock.        **
2e300 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2e310 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74  e unlock attempt
2e320 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67   fails, then Pag
2e330 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65  er.eLock must be
2e340 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20  .        ** set 
2e350 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
2e360 28 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  (see the comment
2e370 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
2e380 6e 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20  ne for .        
2e390 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
2e3a0 61 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70  above for an exp
2e3b0 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20  lanation). .    
2e3c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2e3d0 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  * In order to ge
2e3e0 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  t pager_unlock()
2e3f0 20 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74   to do this, set
2e400 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
2e410 0a 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45  .        ** PAGE
2e420 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69  R_ERROR now. Thi
2e430 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
2e440 79 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74  y counted as a t
2e450 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20  ransition.      
2e460 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74    ** to ERROR st
2e470 61 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  ate in the state
2e480 20 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20   diagram at the 
2e490 74 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65  top of this file
2e4a0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e  ,.        ** sin
2e4b0 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ce we know that 
2e4c0 74 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f  the same call to
2e4d0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
2e4e0 77 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20  will very.      
2e4f0 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61    ** shortly tra
2e500 6e 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65  nsition the page
2e510 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
2e520 4f 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c  OPEN state. Call
2e530 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
2e540 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2e550 65 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e  e() would fail n
2e560 6f 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64  ow, as it should
2e570 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2e580 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
2e590 65 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  e in ERROR state
2e5a0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2e5b0 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  zero outstanding
2e5c0 20 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a   page .        *
2e5d0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20  * references..  
2e5e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e5f0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2e600 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
2e610 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2e620 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
2e630 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
2e640 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
2e650 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2e660 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  ( (pPager->eLock
2e670 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
2e680 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
2e690 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2e6a0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2e6b0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
2e6c0 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
2e6d0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
2e6e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 0a 20 20 20  r->tempFile .   
2e6f0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 70 42    && (pPager->pB
2e700 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
2e710 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
2e720 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e730 3e 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  >0) .    ){.    
2e740 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d    /* The shared-
2e750 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65  lock has just be
2e760 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74  en acquired on t
2e770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e780 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  .      ** and th
2e790 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ere are already 
2e7a0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
2e7b0 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69  he (from a previ
2e7c0 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61  ous.      ** rea
2e7d0 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
2e7e0 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
2e7f0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
2e800 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
2e810 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
2e820 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
2e830 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
2e840 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
2e850 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
2e860 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
2e870 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
2e880 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
2e890 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
2e8a0 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
2e8b0 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
2e8c0 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2e8d0 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
2e8e0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
2e8f0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
2e900 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
2e910 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
2e920 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
2e930 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
2e940 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
2e950 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
2e960 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
2e970 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
2e980 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
2e990 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
2e9a0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
2e9b0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
2e9c0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
2e9d0 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
2e9e0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
2e9f0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
2ea00 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
2ea10 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
2ea20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
2ea30 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
2ea40 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
2ea50 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
2ea60 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
2ea70 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2ea80 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
2ea90 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
2eaa0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2eab0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2eac0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2ead0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
2eae0 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
2eaf0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
2eb00 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
2eb10 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
2eb20 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
2eb30 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
2eb40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2eb50 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
2eb60 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
2eb70 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
2eb80 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
2eb90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2eba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2ebb0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
2ebc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2ebd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
2ebe0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
2ebf0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
2ec00 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2ec10 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
2ec20 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
2ec30 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
2ec40 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
2ec50 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
2ec60 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
2ec70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
2ec80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2ec90 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
2eca0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
2ecb0 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
2ecc0 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
2ecd0 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
2ece0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
2ecf0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
2ed00 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
2ed10 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
2ed20 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
2ed30 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
2ed40 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2ed50 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
2ed60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2ed70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
2ed80 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
2ed90 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
2eda0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2edb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2edc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2edd0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
2ede0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
2edf0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
2ee00 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
2ee10 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
2ee20 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  EN && rc==SQLITE
2ee30 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2ee40 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2ee50 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
2ee60 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66  dbSize);.  }.. f
2ee70 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
2ee80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ee90 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2eea0 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   );.    pager_un
2eeb0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
2eec0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2eed0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2eee0 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  OPEN );.  }else{
2eef0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2ef00 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2ef10 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
2ef20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
2ef30 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
2ef40 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64  ount has reached
2ef50 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20   zero, rollback 
2ef60 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72  any active.** tr
2ef70 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e  ansaction and un
2ef80 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a  lock the pager..
2ef90 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e  **.** Except, in
2efa0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58   locking_mode=EX
2efb0 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65  CLUSIVE when the
2efc0 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
2efd0 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62   in.** the rollb
2efe0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ack journal, the
2eff0 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70   unlock is not p
2f000 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65  erformed and the
2f010 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67  re is.** nothing
2f020 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f   to rollback, so
2f030 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2f040 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74   a no-op..*/ .st
2f050 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
2f060 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
2f070 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2f080 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63  if( (sqlite3Pcac
2f090 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
2f0a0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20  r->pPCache)==0) 
2f0b0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
2f0c0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
2f0d0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
2f0e0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
2f0f0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2f100 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70  number pgno in p
2f110 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70  ager pPager (a p
2f120 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  age.** reference
2f130 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65   has type DbPage
2f140 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  *). If the reque
2f150 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69  sted reference i
2f160 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  s .** successful
2f170 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20  ly obtained, it 
2f180 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70  is copied to *pp
2f190 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  Page and SQLITE_
2f1a0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
2f1b0 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
2f1c0 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65  ted page is alre
2f1d0 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
2f1e0 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  , it is returned
2f1f0 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
2f200 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
2f210 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2f220 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
2f230 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20  th data.** read 
2f240 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2f250 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20  e file. In some 
2f260 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68  cases, the pcach
2f270 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20  e module may.** 
2f280 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c  choose not to al
2f290 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2f2a0 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79  e object and may
2f2b0 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69   reuse an existi
2f2c0 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74  ng.** object wit
2f2d0 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  h no outstanding
2f2e0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a   references..**.
2f2f0 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74  ** The extra dat
2f300 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
2f310 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
2f320 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
2f330 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73  ros the .** firs
2f340 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
2f350 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
2f360 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65  ory. If the page
2f370 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a   requested is .*
2f380 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
2f390 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73   cache when this
2f3a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2f3b0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78  led, then the ex
2f3c0 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c  tra.** data is l
2f3d0 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68  eft as it was wh
2f3e0 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  en the page obje
2f3f0 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  ct was last used
2f400 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
2f410 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73  atabase image is
2f420 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
2f430 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
2f440 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e   or if a .** non
2f450 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70  -zero value is p
2f460 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43  assed as the noC
2f470 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72  ontent parameter
2f480 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71   and the .** req
2f490 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
2f4a0 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65  ot already store
2f4b0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20  d in the cache, 
2f4c0 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75  then no .** actu
2f4d0 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63  al disk read occ
2f4e0 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  urs. In this cas
2f4f0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  e the memory ima
2f500 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ge of the .** pa
2f510 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
2f520 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  d to all zeros. 
2f530 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
2f540 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
2f550 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
2f560 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
2f570 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
2f580 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
2f590 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
2f5a0 73 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69  seperate scenari
2f5b0 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
2f5c0 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
2f5d0 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2f5e0 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
2f5f0 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
2f600 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
2f610 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
2f620 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
2f630 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
2f640 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
2f650 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
2f660 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
2f670 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
2f680 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
2f690 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
2f6a0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  al..**.** If noC
2f6b0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
2f6c0 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65  then the data re
2f6d0 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64  turned is zeroed
2f6e0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62   instead of.** b
2f6f0 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74  eing read from t
2f700 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
2f710 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62  itionally, the b
2f720 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  its correspondin
2f730 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20  g.** to pgno in 
2f740 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
2f750 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65   (bitvec of page
2f760 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65  s already writte
2f770 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  n to the.** jour
2f780 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
2f790 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2f7a0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
2f7b0 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65  tvecs of any ope
2f7c0 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20  n.** savepoints 
2f7d0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65  are set. This me
2f7e0 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20  ans if the page 
2f7f0 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65  is made writable
2f800 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74   at any.** point
2f810 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
2f820 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20  using a call to 
2f830 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f840 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74  e(), its content
2f850 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s.** will not be
2f860 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73   journaled. This
2f870 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a   saves IO..**.**
2f880 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
2f890 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
2f8a0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
2f8b0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
2f8c0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
2f8d0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2f8e0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2f8f0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
2f900 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
2f910 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
2f920 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
2f930 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
2f940 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70   Lookup() attemp
2f950 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
2f960 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
2f970 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
2f980 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
2f990 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
2f9a0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
2f9b0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
2f9c0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
2f9d0 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b   in whereas Look
2f9e0 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
2f9f0 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
2fa00 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
2fa10 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
2fa20 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
2fa30 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
2fa40 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
2fa50 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
2fa60 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
2fa70 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
2fa80 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20   Lookup() never 
2fa90 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
2faa0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
2fab0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
2fac0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
2fad0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2fae0 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
2faf0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
2fb00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2fb10 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
2fb20 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2fb30 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
2fb40 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2fb50 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
2fb60 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
2fb70 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
2fb80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2fb90 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
2fba0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
2fbb0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
2fbc0 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
2fbd0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
2fbe0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
2fbf0 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
2fc00 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
2fc10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
2fc20 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
2fc30 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
2fc40 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
2fc50 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 67  er) );..  if( pg
2fc60 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  no==0 ){.    ret
2fc70 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2fc80 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
2fc90 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
2fca0 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
2fcb0 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e  state, return an
2fcc0 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65   error immediate
2fcd0 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  ly. .  ** Otherw
2fce0 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65  ise, request the
2fcf0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50   page from the P
2fd00 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a  Cache layer. */.
2fd10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
2fd20 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
2fd30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
2fd40 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2fd50 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2fd60 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
2fd70 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
2fd80 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50  he, pgno, 1, ppP
2fd90 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  age);.  }..  if(
2fda0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fdb0 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  {.    /* Either 
2fdc0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
2fdd0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2fde0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
2fdf0 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  or or the.    **
2fe00 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65 61   pager was alrea
2fe10 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  dy in the error-
2fe20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
2fe30 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
2fe40 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20  led..    ** Set 
2fe50 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d  pPg to 0 and jum
2fe60 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74 69  p to the excepti
2fe70 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a  on handler.  */.
2fe80 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
2fe90 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
2fea0 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61  ire_err;.  }.  a
2feb0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
2fec0 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
2fed0 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
2fee0 67 65 29 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  ge)->pPager==pPa
2fef0 67 65 72 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  ger || (*ppPage)
2ff00 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a  ->pPager==0 );..
2ff10 20 20 69 66 28 20 28 2a 70 70 50 61 67 65 29 2d    if( (*ppPage)-
2ff20 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f  >pPager && !noCo
2ff30 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ntent ){.    /* 
2ff40 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2ff50 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79 20   pcache already 
2ff60 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74  contains an init
2ff70 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a  ialized copy of.
2ff80 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e      ** the page.
2ff90 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
2ffa0 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f  further ado.  */
2ffb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2ffc0 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  o<=PAGER_MAX_PGN
2ffd0 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52  O && pgno!=PAGER
2ffe0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2fff0 20 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e   );.    PAGER_IN
30000 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
30010 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
30020 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
30030 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
30040 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
30050 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
30060 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
30070 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
30080 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
30090 2f 0a 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  /..    PAGER_INC
300a0 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
300b0 3b 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50  ;.    pPg = *ppP
300c0 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  age;.    pPg->pP
300d0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
300e0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
300f0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
30100 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
30110 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
30120 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e   a page.    ** n
30130 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
30140 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20  an this, or the 
30150 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70  unused locking-p
30160 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65  age, is requeste
30170 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  d. */.    if( pg
30180 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
30190 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
301a0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
301b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
301c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
301d0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
301e0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
301f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
30200 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72   MEMDB || pPager
30210 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
30220 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69   noContent || !i
30230 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
30240 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
30250 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
30260 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
30270 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
30280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
30290 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
302a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
302b0 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
302c0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
302d0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
302e0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
302f0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
30300 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
30310 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
30320 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
30330 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
30340 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
30350 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
30360 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
30370 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
30380 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
30390 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
303a0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
303b0 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
303c0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
303d0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
303e0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
303f0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
30400 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
30410 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30420 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
30430 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
30440 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
30450 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
30460 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
30470 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
30480 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
30490 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
304a0 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
304b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
304c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
304d0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
304e0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
304f0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
30500 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
30510 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
30520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
30530 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
30540 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
30550 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
30560 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
30570 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
30580 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
30590 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
305a0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
305b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
305c0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
305d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
305e0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
305f0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
30600 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
30610 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
30620 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30630 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  {.        goto p
30640 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
30650 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30660 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
30670 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d  gehash(pPg);.  }
30680 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
30690 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
306a0 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
306b0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
306c0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
306d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
306e0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
306f0 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
30700 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
30710 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ..  *ppPage = 0;
30720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30730 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
30740 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
30750 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
30760 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
30770 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
30780 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
30790 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
307a0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
307b0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
307c0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
307d0 63 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65  cache. .**.** Se
307e0 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
307f0 67 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64  gerGet().  The d
30800 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
30810 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
30820 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  * and sqlite3Pag
30830 65 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20  erGet() is that 
30840 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74  _get() will go t
30850 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72  o the disk and r
30860 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61  ead.** in the pa
30870 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ge if the page i
30880 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
30890 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
308a0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
308b0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67   NULL if the pag
308c0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
308d0 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49  e or if a disk I
308e0 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73  /O error .** has
308f0 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a   ever happened..
30900 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74  */.DbPage *sqlit
30910 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61  e3PagerLookup(Pa
30920 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
30930 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
30940 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73   *pPg = 0;.  ass
30950 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
30960 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
30970 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
30980 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
30990 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
309a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
309b0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26  =PAGER_READER &&
309c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
309d0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
309e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
309f0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
30a00 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
30a10 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
30a20 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
30a30 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65  ease a page refe
30a40 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rence..**.** If 
30a50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
30a60 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
30a70 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
30a80 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
30a90 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
30aa0 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
30ab0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
30ac0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
30ad0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
30ae0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
30af0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
30b00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30b10 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
30b20 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
30b30 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20  gerUnref(DbPage 
30b40 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
30b50 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
30b60 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
30b70 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
30b80 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
30b90 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c  g);.    pagerUnl
30ba0 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67  ockIfUnused(pPag
30bb0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
30bc0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
30bd0 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
30be0 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
30bf0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
30c00 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
30c10 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
30c20 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
30c30 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
30c40 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
30c50 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
30c60 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
30c70 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
30c80 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
30c90 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
30ca0 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
30cb0 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
30cc0 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
30cd0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
30ce0 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
30cf0 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
30d00 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
30d10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30d20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
30d30 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30d40 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
30d50 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
30d60 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
30d70 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
30d80 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
30d90 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
30da0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
30db0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
30dc0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
30dd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30de0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
30df0 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
30e00 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
30e10 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
30e20 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
30e30 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
30e40 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
30e50 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
30e60 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
30e70 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
30e80 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
30e90 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
30ea0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
30eb0 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
30ec0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
30ed0 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
30ee0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
30ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
30f00 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
30f10 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
30f20 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
30f30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
30f40 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
30f50 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
30f60 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
30f70 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
30f80 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
30f90 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
30fa0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
30fb0 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
30fc0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
30fd0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
30fe0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
30ff0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
31000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31010 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
31020 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
31030 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
31040 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
31050 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
31060 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
31070 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
31080 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
31090 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
310a0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
310b0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
310c0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
310d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
310e0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
310f0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
31100 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
31110 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
31120 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
31130 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
31140 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
31150 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
31160 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
31170 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
31180 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
31190 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
311a0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
311b0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
311c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
311d0 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
311e0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
311f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
31200 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
31210 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
31220 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
31230 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
31240 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
31250 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
31260 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
31270 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
31280 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31290 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a  NOMEM;.    }.  .
312a0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
312b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
312c0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
312d0 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69  y open. */.    i
312e0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
312f0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
31300 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
31310 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
31320 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
31330 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  RY ){.        sq
31340 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
31350 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31360 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31370 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
31380 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20   flags =        
31390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
313a0 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  S flags to open 
313b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
313c0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
313d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
313e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
313f0 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70  TE|.          (p
31400 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
31410 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  ? .            (
31420 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
31430 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
31440 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
31450 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  AL):.           
31460 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   (SQLITE_OPEN_MA
31470 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20  IN_JOURNAL).    
31480 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64 65        );.  #ifde
31490 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
314a0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
314b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
314c0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
314d0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
314e0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
314f0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
31500 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
31510 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
31520 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65 0a       );.  #else.
31530 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31540 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
31550 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
31560 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
31570 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65 6e  flags, 0);.  #en
31580 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
31590 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
315a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
315b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
315c0 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20  ;.    }.  .  .  
315d0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
315e0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
315f0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
31600 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
31610 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62   .    ** the sub
31620 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65  -journal if nece
31630 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
31640 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
31650 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
31660 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61  TODO: Check if a
31670 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ll of these are 
31680 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  really required.
31690 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
316a0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
316b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
316c0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
316d0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
316e0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
316f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
31700 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
31710 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
31720 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
31730 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
31740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
31750 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
31760 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
31770 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
31780 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
31790 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
317a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
317b0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
317c0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
317d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
317e0 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
317f0 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d  ER_CACHEMOD;.  }
31800 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
31810 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
31820 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
31830 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  n on the specifi
31840 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ed pager object.
31850 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d   If a .** write-
31860 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
31870 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
31880 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
31890 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
318a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c  *.** If the exFl
318b0 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ag argument is f
318c0 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69  alse, then acqui
318d0 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  re at least a RE
318e0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f  SERVED.** lock o
318f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
31900 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69  ile. If exFlag i
31910 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71  s true, then acq
31920 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a  uire at least.**
31930 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
31940 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ck. If such a lo
31950 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
31960 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a  ld, no locking .
31970 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65  ** functions nee
31980 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  d be called..**.
31990 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  ** If the subjIn
319a0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
319b0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
319c0 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61  n any sub-journa
319d0 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68  l opened.** with
319e0 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
319f0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e  ion will be open
31a00 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed as an in-memo
31a10 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a  ry file. This.**
31a20 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69   has no effect i
31a30 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
31a40 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  l is already ope
31a50 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62  ned (as it may b
31a60 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e  e when.** runnin
31a70 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
31a80 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74  ode) or if the t
31a90 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20  ransaction does 
31aa0 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a  not require a.**
31ab0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66   sub-journal. If
31ac0 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   the subjInMemor
31ad0 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65  y argument is ze
31ae0 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ro, then any req
31af0 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75  uired.** sub-jou
31b00 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e  rnal is implemen
31b10 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66  ted in-memory if
31b20 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e   pPager is an in
31b30 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
31b40 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61  , .** or using a
31b50 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
31b60 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
31b70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
31b80 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
31b90 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69  r, int exFlag, i
31ba0 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29  nt subjInMemory)
31bb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
31bc0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
31bd0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
31be0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
31bf0 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72  errCode;.  asser
31c00 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31c10 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
31c20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
31c30 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  e<PAGER_ERROR );
31c40 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49  .  pPager->subjI
31c50 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75  nMemory = (u8)su
31c60 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69  bjInMemory;..  i
31c70 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72  f( ALWAYS(pPager
31c80 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
31c90 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61  READER) ){.    a
31ca0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
31cb0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
31cc0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
31cd0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
31ce0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
31cf0 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75  pager is configu
31d00 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69  red to use locki
31d10 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
31d20 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  e, and an.      
31d30 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  ** exclusive loc
31d40 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
31d50 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
31d60 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74   held, obtain it
31d70 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   now..      */. 
31d80 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
31d90 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
31da0 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  & sqlite3WalExcl
31db0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
31dc0 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20  ->pWal, -1) ){. 
31dd0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
31de0 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
31df0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
31e00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
31e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31e20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
31e30 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
31e40 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45       sqlite3WalE
31e50 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
31e60 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20  ger->pWal, 1);. 
31e70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
31e80 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20   Grab the write 
31e90 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20  lock on the log 
31ea0 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
31eb0 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a  ful, upgrade to.
31ec0 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52        ** PAGER_R
31ed0 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f  ESERVED state. O
31ee0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
31ef0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
31f00 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
31f10 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d      ** The busy-
31f20 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69  handler is not i
31f30 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65  nvoked if anothe
31f40 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72  r connection alr
31f50 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f  eady.      ** ho
31f60 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  lds the write-lo
31f70 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  ck. If possible,
31f80 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
31f90 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20   will call it.. 
31fa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
31fb0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67   = sqlite3WalBeg
31fc0 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
31fd0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
31fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31ff0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52     /* Obtain a R
32000 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
32010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
32020 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  e. If the exFlag
32030 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20   parameter.     
32040 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65   ** is true, the
32050 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70  n immediately up
32060 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e  grade this to an
32070 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
32080 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75   The.      ** bu
32090 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
320a0 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20  ack can be used 
320b0 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74  when upgrading t
320c0 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a  o the EXCLUSIVE.
320d0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62        ** lock, b
320e0 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
320f0 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
32100 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a  ED lock..      *
32110 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
32120 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
32130 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
32140 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
32150 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c  QLITE_OK && exFl
32160 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
32170 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
32180 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
32190 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
321a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
321b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
321c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
321d0 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52  Change to WRITER
321e0 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20  _LOCKED state.. 
321f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
32200 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50   WAL mode sets P
32210 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50  ager.eState to P
32220 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
32230 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20  ED or CACHEMOD. 
32240 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20       ** when it 
32250 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e  has an open tran
32260 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76  saction, but nev
32270 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46  er to DBMOD or F
32280 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a  INISHED..      *
32290 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
322a0 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65  e in those state
322b0 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  s the code to ro
322c0 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  ll back savepoin
322d0 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
322e0 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70  sactions may cop
322f0 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  y data from the 
32300 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f  sub-journal into
32310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
32320 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20       ** file as 
32330 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65  well as into the
32340 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68 69   page cache. Whi
32350 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f  ch would be inco
32360 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20  rrect in .      
32370 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20  ** WAL mode..   
32380 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
32390 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
323a0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
323b0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
323c0 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
323d0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
323e0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
323f0 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
32400 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
32410 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
32420 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
32430 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
32440 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
32450 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
32460 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
32470 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
32480 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
32490 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  R );.    assert(
324a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
324b0 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
324c0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
324d0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73  OCKED );.    ass
324e0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
324f0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
32500 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
32510 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
32520 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
32530 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72  D(pPager)));.  r
32540 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32550 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65  ** Mark a single
32560 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
32570 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67  iteable. The pag
32580 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
32590 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a  o the .** main j
325a0 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
325b0 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65  urnal as require
325c0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  d. If the page i
325d0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  s written into.*
325e0 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * one of the jou
325f0 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65  rnals, the corre
32600 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
32610 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50  set in the .** P
32620 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
32630 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50  bitvec and the P
32640 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
32650 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
32660 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65  cs.** of any ope
32670 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20  n savepoints as 
32680 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a  appropriate..*/.
32690 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
326a0 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
326b0 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
326c0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
326d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
326e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
326f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
32700 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  _OK;..  /* This 
32710 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63  routine is not c
32720 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77  alled unless a w
32730 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
32740 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20   has already .  
32750 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e  ** been started.
32760 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
32770 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  e may or may not
32780 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73   be open at this
32790 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20   point..  ** It 
327a0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
327b0 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
327c0 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  te..  */.  asser
327d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
327e0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
327f0 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
32800 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32810 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
32820 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  CHEMOD.       ||
32830 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32840 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
32850 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  MOD.  );.  asser
32860 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
32870 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
32880 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
32890 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65 76  or has been prev
328a0 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64 2c  iously detected,
328b0 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d 65   report the same
328c0 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61 69   error.  ** agai
328d0 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e  n. This should n
328e0 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20 74  ot happen, but t
328f0 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64 65  he check provide
32900 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f  s robustness. */
32910 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
32920 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
32930 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
32940 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 48  errCode;..  /* H
32950 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75 74  igher-level rout
32960 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c 20  ines never call 
32970 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
32980 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
32990 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e 20  .  ** writable. 
329a0 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77 61   But check anywa
329b0 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62 75  y, just for robu
329c0 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66 28  stness. */.  if(
329d0 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 72   NEVER(pPager->r
329e0 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75 72  eadOnly) ) retur
329f0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 0a  n SQLITE_PERM;..
32a00 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
32a10 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
32a20 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
32a30 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
32a40 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
32a50 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
32a60 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
32a70 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
32a80 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
32a90 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
32aa0 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
32ab0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
32ac0 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
32ad0 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
32ae0 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
32af0 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
32b00 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
32b10 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
32b20 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
32b30 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
32b40 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
32b50 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
32b60 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
32b70 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
32b80 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
32b90 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
32ba0 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
32bb0 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
32bc0 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
32bd0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
32be0 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
32bf0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
32c00 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
32c10 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
32c20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
32c30 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
32c40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
32c50 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
32c60 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
32c70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
32c80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
32c90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32ca0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
32cb0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
32cc0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
32cd0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
32ce0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
32cf0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
32d00 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
32d10 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
32d20 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
32d30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
32d40 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
32d50 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
32d60 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
32d70 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
32d80 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
32d90 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
32da0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
32db0 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Pg) ){.    asser
32dc0 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
32dd0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65 6c  pPager) );.  }el
32de0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68  se{.  .    /* Th
32df0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
32e00 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
32e10 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
32e20 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
32e30 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
32e40 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
32e50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
32e60 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
32e70 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
32e80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32e90 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
32ea0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
32eb0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
32ec0 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
32ed0 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67 65  al(pPg) && !page
32ee0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
32ef0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
32f00 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
32f10 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ger)==0 );.     
32f20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
32f30 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
32f40 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  ze && isOpen(pPa
32f50 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
32f60 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
32f70 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
32f80 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69 36  ata2;.        i6
32f90 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
32fa0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
32fb0 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
32fc0 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
32fd0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
32fe0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
32ff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
33000 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
33010 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
33020 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
33030 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
33040 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
33050 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
33060 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
33070 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
33080 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 20  Pager) );..     
33090 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
330a0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70  r->journalHdr<=p
330b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
330c0 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  f );.        COD
330d0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
330e0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
330f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
33100 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
33110 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
33120 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
33130 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
33140 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
33150 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
33160 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
33170 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  urs while journa
33180 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
33190 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
331a0 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
331b0 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
331c0 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
331d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
331e0 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
331f0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
33200 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
33210 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
33220 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
33230 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
33240 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
33250 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
33260 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
33270 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
33280 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
33290 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
332a0 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
332b0 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
332c0 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
332d0 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
332e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50 67    */.        pPg
332f0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
33300 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20 20  _NEED_SYNC;..   
33310 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
33320 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
33330 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67  d, iOff, pPg->pg
33340 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
33350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33360 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33370 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33380 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
33390 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
333a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69  ger->pageSize, i
333b0 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  Off+4);.        
333c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
333d0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
333e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
333f0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
33400 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65 72  jfd, iOff+pPager
33410 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b  ->pageSize+4, ck
33420 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sum);.        if
33430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33440 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
33450 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
33460 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
33470 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
33480 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
33490 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
334a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
334b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
334c0 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
334d0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
334e0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
334f0 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
33500 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c  RTRACE(("JOURNAL
33510 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
33520 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
33530 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
33540 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
33550 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
33560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
33570 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
33580 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
33590 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
335a0 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20  (pPg)));..      
335b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
335c0 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61 67  lOff += 8 + pPag
335d0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
335e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
335f0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
33600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
33610 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
33620 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33630 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
33640 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
33650 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
33660 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
33670 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
33680 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
33690 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
336a0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
336b0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
336c0 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70  rc |= addToSavep
336d0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
336e0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
336f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33710 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
33720 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
33730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
33740 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
33750 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
33760 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33770 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
33780 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
33790 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
337a0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
337b0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
337c0 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
337d0 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
337e0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
337f0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
33800 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
33810 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
33820 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
33830 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
33840 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
33850 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
33860 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
33870 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
33880 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
33890 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
338a0 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
338b0 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
338c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
338d0 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
338e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
338f0 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
33900 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
33910 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
33920 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
33930 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
33940 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
33950 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
33960 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
33970 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
33980 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
33990 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
339a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
339b0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
339c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
339d0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
339e0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
339f0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
33a00 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
33a10 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
33a20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
33a30 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
33a40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33a50 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
33a60 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
33a70 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75  teable. This rou
33a80 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
33a90 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d  led before .** m
33aa0 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f  aking changes to
33ab0 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c   a page. The cal
33ac0 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74  ler must check t
33ad0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
33ae0 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63  .** of this func
33af0 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65  tion and be care
33b00 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67  ful not to chang
33b10 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
33b20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20  unless .** this 
33b30 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
33b40 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
33b50 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
33b60 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
33b70 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
33b80 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
33b90 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
33ba0 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
33bb0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
33bc0 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
33bd0 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
33be0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
33bf0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
33c00 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
33c10 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
33c20 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
33c30 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
33c40 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
33c50 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
33c60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
33c70 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  urs, SQLITE_NOME
33c80 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  M or an IO error
33c90 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
33ca0 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69  d.** as appropri
33cb0 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
33cc0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
33cd0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
33ce0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
33cf0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
33d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
33d10 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
33d20 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
33d30 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
33d40 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
33d50 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
33d60 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
33d70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
33d80 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
33d90 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
33da0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
33db0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
33dc0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
33dd0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
33de0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
33df0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
33e00 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  r) );..  if( nPa
33e10 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
33e20 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
33e30 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
33e40 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
33e50 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
33e60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
33e70 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
33e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
33e90 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
33ea0 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
33eb0 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
33ec0 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20  int nPage = 0;  
33ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33ee0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
33ef0 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
33f00 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
33f10 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
33f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
33f30 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
33f40 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
33f50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
33f60 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
33f70 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
33f80 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  C */..    /* Set
33f90 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70   the doNotSyncSp
33fa0 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ill flag to 1. T
33fb0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
33fc0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
33fd0 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20     ** a journal 
33fe0 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
33ff0 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
34000 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
34010 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   by.    ** this 
34020 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
34030 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
34040 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  MDB );.    asser
34050 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
34060 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a  SyncSpill==0 );.
34070 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
34080 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20  tSyncSpill++;.. 
34090 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
340a0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
340b0 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
340c0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
340d0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
340e0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
340f0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
34100 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
34110 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
34120 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
34130 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
34140 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
34150 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
34160 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
34170 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
34180 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
34190 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
341a0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
341b0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
341c0 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
341d0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
341e0 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
341f0 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
34200 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
34210 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
34220 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
34230 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
34240 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
34250 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
34260 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
34270 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
34280 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
34290 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
342a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
342b0 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
342c0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
342d0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
342e0 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
342f0 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
34300 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
34310 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20  ii;.      PgHdr 
34320 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66  *pPage;.      if
34330 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20  ( pg==pPg->pgno 
34340 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  || !sqlite3Bitve
34350 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
34360 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b  nJournal, pg) ){
34370 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
34380 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
34390 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
343a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
343b0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
343c0 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
343d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
343e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
343f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
34400 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
34410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
34420 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
34430 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
34440 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
34450 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
34460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
34470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
34480 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
34490 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
344a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
344b0 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
344c0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
344d0 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
344e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
344f0 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
34500 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
34510 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
34520 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
34530 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
34540 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
34550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
34560 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47      /* If the PG
34570 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
34580 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
34590 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
345a0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
345b0 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
345c0 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
345d0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
345e0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
345f0 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
34600 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
34610 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
34620 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
34630 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
34640 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
34650 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
34660 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
34670 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
34680 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
34690 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
346a0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
346b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
346c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
346d0 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63  E_OK && needSync
346e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
346f0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
34700 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
34710 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
34720 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
34730 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
34740 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
34750 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
34760 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
34770 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
34780 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
34790 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
347a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
347b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
347c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
347d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
347e0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
347f0 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l==1 );.    pPag
34800 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69  er->doNotSyncSpi
34810 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ll--;.  }else{. 
34820 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
34830 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
34840 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
34850 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
34860 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
34870 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
34880 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
34890 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
348a0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
348b0 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
348c0 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
348d0 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
348e0 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
348f0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
34900 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
34910 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
34920 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34930 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
34940 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
34950 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
34960 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  Y;.}.#endif../*.
34970 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
34980 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
34990 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
349a0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
349b0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
349c0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
349d0 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
349e0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
349f0 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
34a00 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
34a10 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
34a20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
34a30 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
34a40 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73  .** the page has
34a50 20 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61   been added as a
34a60 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65   leaf of the fre
34a70 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73  elist and so its
34a80 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c  .** content no l
34a90 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a  onger matters..*
34aa0 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
34ab0 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
34ac0 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
34ad0 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
34ae0 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
34af0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
34b00 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61  s unused. The pa
34b10 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
34b20 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
34b30 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
34b40 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
34b50 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
34b60 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
34b70 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  is optimization 
34b80 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68  can quadruple th
34b90 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
34ba0 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72   .** DELETE oper
34bb0 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ations..*/.void 
34bc0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
34bd0 57 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  Write(PgHdr *pPg
34be0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
34bf0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
34c00 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c  ;.  if( (pPg->fl
34c10 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
34c20 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76   && pPager->nSav
34c30 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  epoint==0 ){.   
34c40 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f   PAGERTRACE(("DO
34c50 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
34c60 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
34c70 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
34c80 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54  ager)));.    IOT
34c90 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
34ca0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
34cb0 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70  Pg->pgno)).    p
34cc0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
34cd0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 20  DR_DONT_WRITE;. 
34ce0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
34cf0 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
34d00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
34d10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
34d20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
34d30 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
34d40 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
34d50 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20  change-counter, 
34d60 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79  stored as a 4-by
34d70 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
34d80 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61  teger starting a
34d90 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65  t .** byte offse
34da0 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  t 24 of the page
34db0 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  r file..**.** If
34dc0 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
34dd0 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20  e flag is zero, 
34de0 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e  then this is don
34df0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  e by calling .**
34e00 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34e10 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20  te() on page 1, 
34e20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  then modifying t
34e30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
34e40 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  he.** page data.
34e50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34e60 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  e file will be u
34e70 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  pdated when the 
34e80 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
34e90 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
34ea0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ted..**.** The i
34eb0 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
34ec0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e   may only be non
34ed0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62  -zero if the lib
34ee0 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
34ef0 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51  d.** with the SQ
34f00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
34f10 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64  IC_WRITE macro d
34f20 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  efined. In this 
34f30 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69  case,.** if isDi
34f40 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rect is non-zero
34f50 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
34f60 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61  ase file is upda
34f70 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  ted directly.** 
34f80 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70  by writing an up
34f90 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  dated version of
34fa0 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20   page 1 using a 
34fb0 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20  call to the .** 
34fc0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
34fd0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
34fe0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
34ff0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
35000 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
35010 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64   int isDirectMod
35020 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
35030 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
35040 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
35050 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35060 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
35070 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
35080 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
35090 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
350a0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
350b0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
350c0 29 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61  ) );..  /* Decla
350d0 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  re and initializ
350e0 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  e constant integ
350f0 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49  er 'isDirect'. I
35100 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69  f the.  ** atomi
35110 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
35120 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
35130 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74  in this build, t
35140 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a  hen isDirect.  *
35150 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  * is initialized
35160 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
35170 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69  ssed as the isDi
35180 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74  rectMode paramet
35190 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  er.  ** to this 
351a0 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  function. Otherw
351b0 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ise, it is alway
351c0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20  s set to zero.. 
351d0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65   **.  ** The ide
351e0 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  a is that if the
351f0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
35200 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
35210 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61  t.  ** enabled a
35220 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
35230 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e  the compiler can
35240 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20   omit the tests 
35250 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63  of.  ** 'isDirec
35260 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c  t' below, as wel
35270 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65  l as the block e
35280 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20  nclosed in the. 
35290 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63   ** "if( isDirec
352a0 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a  t )" condition..
352b0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
352c0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
352d0 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65  C_WRITE.# define
352e0 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20   DIRECT_MODE 0. 
352f0 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63   assert( isDirec
35300 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e  tMode==0 );.  UN
35310 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
35320 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65  sDirectMode);.#e
35330 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52  lse.# define DIR
35340 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63  ECT_MODE isDirec
35350 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20  tMode.#endif..  
35360 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
35370 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20  ngeCountDone && 
35380 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
35390 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
353a0 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  PgHdr;          
353b0 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e        /* Referen
353c0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
353d0 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63      u32 change_c
353e0 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20  ounter;         
353f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
35400 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75  ue of change-cou
35410 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  nter field */.. 
35420 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
35430 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
35440 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
35450 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  d) );..    /* Op
35460 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
35470 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
35480 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
35490 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
354a0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
354b0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
354c0 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d  pPgHdr==0 || rc=
354d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
354e0 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e     /* If page on
354f0 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75  e was fetched su
35500 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20  ccessfully, and 
35510 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
35520 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72   not.    ** oper
35530 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d  ating in direct-
35540 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20  mode, make page 
35550 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65  1 writable.  Whe
35560 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a  n not in .    **
35570 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61   direct mode, pa
35580 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68  ge 1 is always h
35590 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64  eld in cache and
355a0 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72   hence the Pager
355b0 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  Get().    ** abo
355c0 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63  ve is always suc
355d0 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20  cessful - hence 
355e0 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63  the ALWAYS on rc
355f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20  ==SQLITE_OK..   
35600 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52   */.    if( !DIR
35610 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41  ECT_MODE && ALWA
35620 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  YS(rc==SQLITE_OK
35630 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
35640 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35650 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
35660 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
35670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35680 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
35690 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
356a0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
356b0 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
356c0 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f  */.      change_
356d0 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
356e0 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
356f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
35700 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  s);.      change
35710 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
35720 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
35730 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
35740 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
35750 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f  unter);..      /
35760 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
35770 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
35780 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
35790 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20  96..99 and in.  
357a0 20 20 20 20 2a 2a 20 62 79 74 65 73 20 39 32 2e      ** bytes 92.
357b0 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20 63 68  .95 store the ch
357c0 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66 6f 72  ange counter for
357d0 20 77 68 69 63 68 20 74 68 65 20 76 65 72 73 69   which the versi
357e0 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  on number.      
357f0 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
35800 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
35810 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e  ((char*)pPgHdr->
35820 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67  pData)+92, chang
35830 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20  e_counter);.    
35840 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
35850 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
35860 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
35870 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a  RSION_NUMBER);..
35880 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e        /* If runn
35890 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f  ing in direct mo
358a0 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f  de, write the co
358b0 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31  ntents of page 1
358c0 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f   to the file. */
358d0 0a 20 20 20 20 20 20 69 66 28 20 44 49 52 45 43  .      if( DIREC
358e0 54 5f 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20  T_MODE ){.      
358f0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42    const void *zB
35900 75 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  uf;.        asse
35910 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69  rt( pPager->dbFi
35920 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20  leSize>0 );.    
35930 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
35940 72 2c 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61  r, pPgHdr->pData
35950 2c 20 31 2c 20 36 2c 20 72 63 3d 53 51 4c 49 54  , 1, 6, rc=SQLIT
35960 45 5f 4e 4f 4d 45 4d 2c 20 7a 42 75 66 29 3b 0a  E_NOMEM, zBuf);.
35970 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
35980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
35990 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
359a0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
359b0 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
359c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
359d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
359e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
359f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35a00 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
35a10 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
35a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35a30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35a40 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
35a50 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
35a60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
35a70 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
35a80 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
35a90 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
35aa0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
35ab0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
35ac0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
35ad0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74  the pager file t
35ae0 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20  o disk. This is 
35af0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d  a no-op for in-m
35b00 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f  emory files.** o
35b10 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
35b20 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
35b30 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
35b40 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
35b50 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
35b60 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20 69  r for which it i
35b70 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a  s a no-op, this.
35b80 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
35b90 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  rns SQLITE_OK. O
35ba0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20  therwise, an IO 
35bb0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
35bc0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
35bd0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
35be0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
35bf0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
35c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35c20 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72   code */.  asser
35c30 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
35c40 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
35c50 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  c ){.    rc = SQ
35c60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
35c70 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
35c80 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
35c90 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
35ca0 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
35cb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35cc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
35cd0 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
35ce0 6c 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72 69  lled while a wri
35cf0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
35d00 73 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20 72  s active in.** r
35d10 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65 20  ollback. If the 
35d20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
35d30 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 20   WAL mode, this 
35d40 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
35d50 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
35d60 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
35d70 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  n does not alrea
35d80 64 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c 55  dy have an EXCLU
35d90 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a  SIVE lock on .**
35da0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35db0 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69  le, an attempt i
35dc0 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e  s made to obtain
35dd0 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   one..**.** If t
35de0 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
35df0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
35e00 64 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70 74  d or the attempt
35e10 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69 73   to obtain it is
35e20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c 20  .** successful, 
35e30 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  or the connectio
35e40 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64 65  n is in WAL mode
35e50 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
35e60 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68 65  eturned..** Othe
35e70 72 77 69 73 65 2c 20 65 69 74 68 65 72 20 53 51  rwise, either SQ
35e80 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e 20  LITE_BUSY or an 
35e90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
35ea0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
35eb0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
35ec0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
35ed0 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50 61  ExclusiveLock(Pa
35ee0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
35ef0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
35f00 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  OK;.  assert( pP
35f10 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35f20 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
35f30 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  MOD .       || p
35f40 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
35f50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
35f60 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  D .       || pPa
35f70 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35f80 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
35f90 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28   .  );.  assert(
35fa0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
35fb0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
35fc0 20 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73 65   if( 0==pagerUse
35fd0 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
35fe0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
35ff0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
36000 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
36010 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  K);.  }.  return
36020 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
36030 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
36040 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
36050 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
36060 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
36070 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
36080 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
36090 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
360a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
360b0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
360c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
360d0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
360e0 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
360f0 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
36100 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
36110 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
36120 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
36130 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
36140 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
36150 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
36160 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
36170 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
36180 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20  updated,.**   * 
36190 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
361a0 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68  ynced (unless th
361b0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
361c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
361d0 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c  sed),.**   * all
361e0 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65   dirty pages are
361f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
36200 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a  database file, .
36210 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
36220 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ase file is trun
36230 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72  cated (if requir
36240 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ed), and.**   * 
36250 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36260 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  e synced. .**.**
36270 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
36280 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
36290 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
362a0 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e  action is to fin
362b0 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74  alize .** (delet
362c0 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  e, truncate or z
362d0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61  ero the first pa
362e0 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e  rt of) the journ
362f0 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20  al file (or .** 
36300 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
36310 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
36320 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
36330 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
36340 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
36350 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
36360 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
36370 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
36380 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
36390 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
363a0 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
363b0 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
363c0 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
363d0 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
363e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
363f0 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
36400 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
36410 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
36420 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
36430 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
36440 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
36450 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
36460 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
36470 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
36480 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
36490 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
364a0 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
364b0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
364c0 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
364d0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
364e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
364f0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
36500 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
36510 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ster,           
36520 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
36530 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
36540 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nal name */.  in
36550 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20  t noSync        
36560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36570 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68   True to omit th
36580 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64  e xSync on the d
36590 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  b file */.){.  i
365a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
365b0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
365c0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
365d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
365e0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
365f0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
36600 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36610 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36620 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
36630 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
36640 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36650 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20  WRITER_DBMOD.   
36660 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
36670 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
36680 4f 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OR.  );.  assert
36690 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
366a0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
366b0 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f 72  .  /* If a prior
366c0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
366d0 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72 72   report that err
366e0 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69  or again. */.  i
366f0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
36700 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
36710 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
36720 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  de;..  PAGERTRAC
36730 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E(("DATABASE SYN
36740 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
36750 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e  er=%s nSize=%d\n
36760 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
36770 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
36780 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ster, pPager->db
36790 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  Size));..  /* If
367a0 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68 61   no database cha
367b0 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d  nges have been m
367c0 61 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  ade, return earl
367d0 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  y. */.  if( pPag
367e0 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
367f0 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
36800 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
36810 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  _OK;..  if( MEMD
36820 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  B ){.    /* If t
36830 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
36840 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
36850 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
36860 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
36870 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f  s.    ** functio
36880 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
36890 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
368a0 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70 2e   mostly a no-op.
368b0 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a 20    However, any. 
368c0 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e 20     ** backup in 
368d0 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20 74  progress needs t
368e0 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a  o be restarted..
368f0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
36900 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
36910 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
36920 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
36930 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
36940 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
36950 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20 73  PgHdr *pList = s
36960 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
36970 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
36980 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 69 66  Cache);.      if
36990 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
369a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c     rc = pagerWal
369b0 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70  Frames(pPager, p
369c0 4c 69 73 74 2c 20 70 50 61 67 65 72 2d 3e 64 62  List, pPager->db
369d0 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20 20 20 20  Size, 1, .      
369e0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 66        (pPager->f
369f0 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61 67 65 72  ullSync ? pPager
36a00 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3a 20 30  ->sync_flags : 0
36a10 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
36a20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
36a30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36a40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
36a50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
36a60 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
36a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
36a80 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e{.      /* The 
36a90 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
36aa0 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
36ab0 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61 63  ge-counter. Exac
36ac0 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20 20  tly how it.     
36ad0 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65   ** does this de
36ae0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
36af0 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
36b00 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69  ic-update optimi
36b10 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  zation.      ** 
36b20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
36b30 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64  ompile time, and
36b40 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   if this transac
36b50 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a  tion meets the .
36b60 20 20 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65        ** runtime
36b70 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65   criteria to use
36b80 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20   the operation: 
36b90 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
36ba0 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65  **    * The file
36bb0 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
36bc0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
36bd0 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
36be0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f       **      blo
36bf0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
36c00 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
36c10 20 20 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63    **    * This c
36c20 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
36c30 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
36c40 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
36c50 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2a  nd.      **    *
36c60 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   Exactly one pag
36c70 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
36c80 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e  ied and store in
36c90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36ca0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
36cb0 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69    ** If the opti
36cc0 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74  mization was not
36cd0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
36ce0 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74  ile time, then t
36cf0 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  he.      ** page
36d00 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
36d10 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20  nter() function 
36d20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64  is called to upd
36d30 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20  ate the change. 
36d40 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20       ** counter 
36d50 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64  in 'indirect-mod
36d60 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d  e'. If the optim
36d70 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69  ization is compi
36d80 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 20  led in but.     
36d90 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69   ** is not appli
36da0 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72  cable to this tr
36db0 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20  ansaction, call 
36dc0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
36dd0 65 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  eate().      ** 
36de0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
36df0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
36e00 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
36e10 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
36e20 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ll.      ** page
36e30 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
36e40 6e 74 65 72 28 29 20 74 6f 20 75 70 64 61 74 65  nter() to update
36e50 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
36e60 74 65 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a  ter in indirect.
36e70 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a        ** mode. .
36e80 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36e90 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
36ea0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
36eb0 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64   is both enabled
36ec0 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c   and applicable,
36ed0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63  .      ** then c
36ee0 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  all pager_incr_c
36ef0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74  hangecounter() t
36f00 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
36f10 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20  nge-counter.    
36f20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27    ** in 'direct'
36f30 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   mode. In this c
36f40 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
36f50 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  file will never 
36f60 62 65 0a 20 20 20 20 20 20 2a 2a 20 63 72 65 61  be.      ** crea
36f70 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
36f80 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
36f90 2a 2f 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49  */.  #ifdef SQLI
36fa0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
36fb0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 50 67 48  _WRITE.      PgH
36fc0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 61  dr *pPg;.      a
36fd0 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
36fe0 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
36ff0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
37000 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
37010 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37020 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
37030 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
37040 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
37050 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a  OURNALMODE_WAL .
37060 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
37070 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69  f( !zMaster && i
37080 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
37090 64 29 20 0a 20 20 20 20 20 20 20 26 26 20 70 50  d) .       && pP
370a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
370b0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
370c0 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
370d0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
370e0 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze>=pPager->dbOr
370f0 69 67 53 69 7a 65 0a 20 20 20 20 20 20 20 26 26  igSize.       &&
37100 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
37110 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
37120 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
37130 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
37140 70 44 69 72 74 79 29 0a 20 20 20 20 20 20 29 7b  pDirty).      ){
37150 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 70 64 61  .        /* Upda
37160 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
37170 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
37180 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
37190 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
371a0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f          ** follo
371b0 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
371c0 6f 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d  odify the in-mem
371d0 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
371e0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20  on of page 1 .  
371f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c        ** to incl
37200 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 20  ude the updated 
37210 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
37220 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
37230 67 65 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a  ge 1 .        **
37240 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
37250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
37260 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
37270 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20  tomic-write .   
37280 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79       ** property
37290 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
372a0 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69  e-system, this i
372b0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 20 20  s safe..        
372c0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
372d0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
372e0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
372f0 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   1);.      }else
37300 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
37310 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
37320 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
37330 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37340 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37350 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
37360 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
37370 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
37380 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37390 20 20 20 7d 0a 20 20 23 65 6c 73 65 0a 20 20 20     }.  #else.   
373a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
373b0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
373c0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 23  (pPager, 0);.  #
373d0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
373e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
373f0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
37400 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 0a 20  e_one_exit;.  . 
37410 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
37420 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
37430 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
37440 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
37450 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
37460 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
37470 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
37480 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
37490 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
374a0 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  nal.      ** fil
374b0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
374c0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
374d0 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20  vacuum mode..   
374e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
374f0 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
37500 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
37510 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
37520 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 20   than the .     
37530 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75   ** current valu
37540 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
37550 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61  e, set dbSize ba
37560 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ck to the value.
37570 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74        ** that it
37580 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
37590 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
375a0 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
375b0 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  , the.      ** c
375c0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
375d0 61 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e  agerGet() return
375e0 20 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e   zeroed pages in
375f0 73 74 65 61 64 20 6f 66 20 0a 20 20 20 20 20 20  stead of .      
37600 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74 61 20  ** reading data 
37610 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
37620 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
37630 0a 20 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  .  #ifndef SQLIT
37640 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
37650 4d 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  M.      if( pPag
37660 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
37670 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
37680 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
37690 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
376a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
376b0 4f 46 46 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  OFF.      ){.   
376c0 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20       Pgno i;    
376d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
376f0 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
37700 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ble */.        c
37710 6f 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20  onst Pgno iSkip 
37720 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
37730 70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64  pPager); /* Pend
37740 69 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f  ing lock page */
37750 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 50  .        const P
37760 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70 50 61  gno dbSize = pPa
37770 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20  ger->dbSize;    
37780 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
37790 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20  mage size */ .  
377a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
377b0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
377c0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20  bOrigSize;.     
377d0 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65     for( i=dbSize
377e0 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64  +1; i<=pPager->d
377f0 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29  bOrigSize; i++ )
37800 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
37810 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
37820 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
37830 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d  urnal, i) && i!=
37840 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
37850 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
37860 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
37870 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
37880 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  l */.           
37890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
378a0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
378b0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
378c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
378d0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
378e0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
378f0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
37900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37910 67 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b  gerWrite(pPage);
37920 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
37930 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
37940 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
37950 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
37960 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
37970 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
37980 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
37990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
379a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
379b0 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  = dbSize;.      
379c0 7d 20 0a 20 20 23 65 6e 64 69 66 0a 20 20 0a 20  } .  #endif.  . 
379d0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
379e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
379f0 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
37a00 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
37a10 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20 20 20  a master .      
37a20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
37a30 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
37a40 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
37a50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37a60 65 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  e, .      ** or 
37a70 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55  if zMaster is NU
37a80 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  LL (no master jo
37a90 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69  urnal), then thi
37aa0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
37ab0 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
37ac0 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
37ad0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
37ae0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
37af0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37b00 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
37b10 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
37b20 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79  ;.  .      /* Sy
37b30 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
37b40 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20 61 6c  ile and write al
37b50 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
37b60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
37b70 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61       ** If the a
37b80 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
37b90 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65 69  imization is bei
37ba0 6e 67 20 75 73 65 64 2c 20 74 68 69 73 20 73 79  ng used, this sy
37bb0 6e 63 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20  nc will not .   
37bc0 20 20 20 2a 2a 20 63 72 65 61 74 65 20 74 68 65     ** create the
37bd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
37be0 20 70 65 72 66 6f 72 6d 20 61 6e 79 20 72 65 61   perform any rea
37bf0 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  l IO..      **. 
37c00 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
37c10 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
37c20 65 72 20 70 61 67 65 20 77 61 73 20 6a 75 73 74  er page was just
37c30 20 6d 6f 64 69 66 69 65 64 2c 20 75 6e 6c 65 73   modified, unles
37c40 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 61  s the.      ** a
37c50 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
37c60 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
37c70 64 20 69 74 20 69 73 20 61 6c 6d 6f 73 74 20 63  d it is almost c
37c80 65 72 74 61 69 6e 20 74 68 61 74 20 74 68 65 0a  ertain that the.
37c90 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
37ca0 20 72 65 71 75 69 72 65 73 20 61 20 73 79 6e 63   requires a sync
37cb0 20 68 65 72 65 2e 20 48 6f 77 65 76 65 72 2c 20   here. However, 
37cc0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
37cd0 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 20  exclusive.      
37ce0 2a 2a 20 6f 6e 20 61 20 73 79 73 74 65 6d 20 75  ** on a system u
37cf0 6e 64 65 72 20 6d 65 6d 6f 72 79 20 70 72 65 73  nder memory pres
37d00 73 75 72 65 20 69 74 20 69 73 20 6a 75 73 74 20  sure it is just 
37d10 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68  possible that th
37d20 69 73 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  is is .      ** 
37d30 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 20 49 6e  not the case. In
37d40 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
37d50 20 6c 69 6b 65 6c 79 20 65 6e 6f 75 67 68 20 74   likely enough t
37d60 68 61 74 20 74 68 65 20 72 65 64 75 6e 64 61 6e  hat the redundan
37d70 74 0a 20 20 20 20 20 20 2a 2a 20 78 53 79 6e 63  t.      ** xSync
37d80 28 29 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20  () call will be 
37d90 63 68 61 6e 67 65 64 20 74 6f 20 61 20 6e 6f 2d  changed to a no-
37da0 6f 70 20 62 79 20 74 68 65 20 4f 53 20 61 6e 79  op by the OS any
37db0 68 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  how. .      */. 
37dc0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
37dd0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 30 29  urnal(pPager, 0)
37de0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
37df0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
37e00 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
37e10 65 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20  e_exit;.  .     
37e20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
37e30 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
37e40 72 2c 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  r,sqlite3PcacheD
37e50 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
37e60 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20  >pPCache));.    
37e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
37e90 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
37ea0 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
37eb0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
37ec0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
37ed0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
37ee0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
37ef0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
37f00 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 0a  r->pPCache);.  .
37f10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
37f20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
37f30 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a  not the same siz
37f40 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  e as the databas
37f50 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a  e image,.      *
37f60 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72  * then use pager
37f70 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f  _truncate to gro
37f80 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20  w or shrink the 
37f90 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
37fa0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
37fb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50  ager->dbSize!=pP
37fc0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
37fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
37fe0 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e   nNew = pPager->
37ff0 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72  dbSize - (pPager
38000 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f  ->dbSize==PAGER_
38010 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
38020 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
38030 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
38040 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
38050 42 4d 4f 44 20 29 3b 0a 20 20 20 20 20 20 20 20  BMOD );.        
38060 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
38070 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77  ate(pPager, nNew
38080 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
38090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
380a0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
380b0 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
380c0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 46   }.  .      /* F
380d0 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68 65  inally, sync the
380e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
380f0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  */.      if( !pP
38100 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20  ager->noSync && 
38110 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  !noSync ){.     
38120 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
38130 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
38140 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
38150 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lags);.      }. 
38160 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44       IOTRACE(("D
38170 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
38180 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger)).    }.  }.
38190 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e  .commit_phase_on
381a0 65 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63  e_exit:.  if( rc
381b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
381c0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
381d0 65 72 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  er) ){.    pPage
381e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
381f0 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
38200 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
38210 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68  rc;.}.../*.** Wh
38220 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
38230 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
38240 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
38250 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  s been completel
38260 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20  y.** updated to 
38270 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e  reflect the chan
38280 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ges made by the 
38290 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
382a0 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65  ion and.** synce
382b0 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a  d to disk. The j
382c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c  ournal file stil
382d0 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  l exists in the 
382e0 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20  file-system .** 
382f0 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61  though, and if a
38300 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
38310 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  at this point it
38320 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
38330 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61  .** be used as a
38340 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
38350 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
38360 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20  nsaction rolled 
38370 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
38380 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69   function finali
38390 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  zes the journal 
383a0 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20  file, either by 
383b0 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72  deleting, .** tr
383c0 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74  uncating or part
383d0 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74  ially zeroing it
383e0 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  , so that it can
383f0 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  not be used .** 
38400 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  for hot-journal 
38410 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74  rollback. Once t
38420 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20  his is done the 
38430 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a  transaction is.*
38440 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f  * irrevocably co
38450 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
38460 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
38470 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
38480 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
38490 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  and the pager.**
384a0 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20   moves into the 
384b0 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68  error state. Oth
384c0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
384d0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
384e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
384f0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
38500 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
38510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
38520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
38530 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
38540 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
38550 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
38560 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
38570 64 20 69 66 20 61 20 70 72 69 6f 72 20 65 72 72  d if a prior err
38580 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
38590 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75  .  ** But if (du
385a0 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
385b0 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e  ror elsewhere in
385c0 20 74 68 65 20 73 79 73 74 65 6d 29 20 69 74 20   the system) it 
385d0 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61  does get.  ** ca
385e0 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72  lled, just retur
385f0 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  n the same error
38600 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f   code without do
38610 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f  ing anything. */
38620 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
38630 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
38640 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
38650 72 72 43 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  rrCode;..  asser
38660 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
38670 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
38680 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
38690 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
386a0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
386b0 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
386c0 20 28 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   (pagerUseWal(pP
386d0 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
386e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
386f0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 29 0a  RITER_CACHEMOD).
38700 20 20 29 3b 0a 20 2