/ Hex Artifact Content
Login

Artifact e34303157c734c6a9488296200dfa53a074622c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 74 68 65  rticular the the
0d50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 72 65 65   content of free
0d60: 6c 69 73 74 20 6c 65 61 66 0a 2a 2a 20 70 61 67  list leaf.** pag
0d70: 65 73 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65  es can be change
0d80: 64 20 61 72 62 69 74 61 72 69 6c 79 20 77 69 74  d arbitarily wit
0d90: 68 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74  hout effecting t
0da0: 68 65 20 6c 6f 67 69 63 61 6c 20 65 71 75 69 76  he logical equiv
0db0: 61 6c 65 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  alence.** of the
0dc0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a   database..** .*
0dd0: 2a 20 28 37 29 20 41 74 20 61 6e 79 20 74 69 6d  * (7) At any tim
0de0: 65 2c 20 69 66 20 61 6e 79 20 73 75 62 73 65 74  e, if any subset
0df0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
0e00: 65 6d 70 74 79 20 73 65 74 20 61 6e 64 20 74 68  empty set and th
0e10: 65 20 74 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20  e total set,.** 
0e20: 20 20 20 20 6f 66 20 74 68 65 20 75 6e 73 79 6e      of the unsyn
0e30: 63 65 64 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ced changes to a
0e40: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
0e50: 6c 20 61 72 65 20 72 65 6d 6f 76 65 64 20 61 6e  l are removed an
0e60: 64 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f  d the .**     jo
0e70: 75 72 6e 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20  urnal is rolled 
0e80: 62 61 63 6b 2c 20 74 68 65 20 72 65 73 75 6c 74  back, the result
0e90: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
0ea0: 65 20 77 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61  e will be logica
0eb0: 6c 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c  l.**     equival
0ec0: 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ent to the datab
0ed0: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
0ee0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0ef0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0f00: 20 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20   .** (8) When a 
0f10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0f20: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0f30: 78 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64  xTruncate method
0f40: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20   of the VFS.**  
0f50: 20 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20     is called to 
0f60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
0f70: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65  base file to the
0f80: 20 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61   same size it wa
0f90: 73 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20  s at.**     the 
0fa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
0fb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28   transaction.  (
0fc0: 49 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74  In some VFSes, t
0fd0: 68 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20  he xTruncate.** 
0fe0: 20 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20      method is a 
0ff0: 6e 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20  no-op, but that 
1000: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20  does not change 
1010: 74 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c  the fact the SQL
1020: 69 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20  ite will.**     
1030: 69 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a  invoke it.).** .
1040: 2a 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20  ** (9) Whenever 
1050: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1060: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61  e is modified, a
1070: 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20  t least one bit 
1080: 69 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20  in the range.** 
1090: 20 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f      of bytes fro
10a0: 6d 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20  m 24 through 39 
10b0: 69 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62  inclusive will b
10c0: 65 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  e changed prior 
10d0: 74 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20  to releasing.** 
10e0: 20 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56      the EXCLUSIV
10f0: 45 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67  E lock, thus sig
1100: 6e 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e  naling other con
1110: 6e 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  nections on the 
1120: 73 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61  same.**     data
1130: 62 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68  base to flush th
1140: 65 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a  eir caches..**.*
1150: 2a 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65  * (10) The patte
1160: 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79  rn of bits in by
1170: 74 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33  tes 24 through 3
1180: 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65  9 shall not repe
1190: 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20  at in less.**   
11a0: 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c     than one bill
11b0: 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ion transactions
11c0: 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64  ..**.** (11) A d
11d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
11e0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74  well-formed at t
11f0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64  he beginning and
1200: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
1210: 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76  on.**      of ev
1220: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
1230: 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45  .**.** (12) An E
1240: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
1250: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1260: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1270: 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20  writing to.**   
1280: 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20     the database 
1290: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29  file..**.** (13)
12a0: 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   A SHARED lock i
12b0: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
12c0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c  tabase file whil
12d0: 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a  e reading any.**
12e0: 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75        content ou
12f0: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1300: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  e file..**.*****
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1360: 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f  * Macros for tro
1370: 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e  ubleshooting.  N
1380: 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f  ormally turned o
1390: 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20  ff.*/.#if 0.int 
13a0: 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63  sqlite3PagerTrac
13b0: 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f  e=1;  /* True to
13c0: 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20   enable tracing 
13d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74  */.#define sqlit
13e0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72  e3DebugPrintf pr
13f0: 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47  intf.#define PAG
1400: 45 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69  ERTRACE(X)     i
1410: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  f( sqlite3PagerT
1420: 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44  race ){ sqlite3D
1430: 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a  ebugPrintf X; }.
1440: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
1450: 47 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64  GERTRACE(X).#end
1460: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1470: 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72  llowing two macr
1480: 6f 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  os are used with
1490: 69 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43  in the PAGERTRAC
14a0: 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65  E() macros above
14b0: 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74  .** to print out
14c0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
14d0: 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49  s. .**.** PAGERI
14e0: 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  D() takes a poin
14f0: 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73  ter to a Pager s
1500: 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67  truct as its arg
1510: 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73  ument. The.** as
1520: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65  sociated file-de
1530: 73 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75  scriptor is retu
1540: 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45  rned. FILEHANDLE
1550: 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71  ID() takes an sq
1560: 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74  lite3_file.** st
1570: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1580: 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ment..*/.#define
1590: 20 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e   PAGERID(p) ((in
15a0: 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69  t)(p->fd)).#defi
15b0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
15c0: 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f  fd) ((int)fd)../
15d0: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65  *.** The Pager.e
15e0: 53 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73  State variable s
15f0: 74 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e  tores the curren
1600: 74 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70  t 'state' of a p
1610: 61 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72  ager. A.** pager
1620: 20 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f   may be in any o
1630: 6e 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20  ne of the seven 
1640: 73 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20  states shown in 
1650: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
1660: 20 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a   state diagram..
1670: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d   OPEN <------+--
16a0: 2d 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20  ----+.**        
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
16d0: 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  |      |.**     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20           V      
1700: 20 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20     |      |.**  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d               +--
1720: 2d 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d  -------> READER-
1730: 2d 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a  ------+      |.*
1740: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1750: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  |              |
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1780: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1790: 20 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20    V             
17a0: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
17b0: 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57        |<-------W
17c0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d  RITER_LOCKED----
17d0: 2d 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20  --> ERROR.**    
17e0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
17f0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1800: 20 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a             ^  .*
1810: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1820: 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56  |              V
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1850: 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45     |<------WRITE
1860: 52 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d  R_CACHEMOD------
1870: 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20  -->|.**         
1880: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1890: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18a0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
18b0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
18c0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
18d0: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
18f0: 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f  -----WRITER_DBMO
1900: 44 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  D---------->|.**
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1940: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1950: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1960: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
1970: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1980: 20 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49       +<------WRI
1990: 54 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d  TER_FINISHED----
19a0: 2d 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ---->+.**.**.** 
19b0: 4c 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72  List of state tr
19c0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
19d0: 65 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74  e C [function] t
19e0: 68 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63  hat performs eac
19f0: 68 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e  h:.** .**   OPEN
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e                ->
1a10: 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20   READER         
1a20: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1a30: 65 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a  erSharedLock].**
1a40: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a50: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1a70: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a  er_unlock].**.**
1a80: 20 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20     READER       
1a90: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c       -> WRITER_L
1aa0: 4f 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c  OCKED       [sql
1ab0: 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a  ite3PagerBegin].
1ac0: 2a 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b  **   WRITER_LOCK
1ad0: 45 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52  ED     -> WRITER
1ae0: 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70  _CACHEMOD     [p
1af0: 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b00: 6c 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43  l].**   WRITER_C
1b10: 41 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49  ACHEMOD   -> WRI
1b20: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20  TER_DBMOD       
1b30: 20 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a   [syncJournal].*
1b40: 2a 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  *   WRITER_DBMOD
1b50: 20 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f        -> WRITER_
1b60: 46 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71  FINISHED     [sq
1b70: 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b80: 50 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57  PhaseOne].**   W
1b90: 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20  RITER_***       
1ba0: 20 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20   -> READER      
1bb0: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65          [pager_e
1bc0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a  nd_transaction].
1bd0: 2a 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  **.**   WRITER_*
1be0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52  **        -> ERR
1bf0: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OR              
1c00: 20 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a   [pager_error].*
1c10: 2a 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20  *   ERROR       
1c20: 20 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20        -> OPEN   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c40: 67 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a  ger_unlock].** .
1c50: 2a 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a  **.**  OPEN:.**.
1c60: 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20  **    The pager 
1c70: 73 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69  starts up in thi
1c80: 73 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67  s state. Nothing
1c90: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69   is guaranteed i
1ca0: 6e 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61  n this.**    sta
1cb0: 74 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61  te - the file ma
1cc0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
1cd0: 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64  locked and the d
1ce0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a  atabase size is.
1cf0: 2a 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54  **    unknown. T
1d00: 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
1d10: 6e 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77  not be read or w
1d20: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ritten..**.**   
1d30: 20 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72   * No read or wr
1d40: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1d50: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
1d60: 20 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20   * Any lock, or 
1d70: 6e 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20  no lock at all, 
1d80: 6d 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74  may be held on t
1d90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1da0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
1db0: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1dc0: 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20   and dbFileSize 
1dd0: 76 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f  variables may no
1de0: 74 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a  t be trusted..**
1df0: 0a 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a  .**  READER:.**.
1e00: 2a 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74  **    In this st
1e10: 61 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75  ate all the requ
1e20: 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61  irements for rea
1e30: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
1e40: 65 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c  e in .**    roll
1e50: 62 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d  back (non-WAL) m
1e60: 6f 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c  ode are met. Unl
1e70: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
1e80: 20 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a   (or recently.**
1e90: 20 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c      was) in excl
1ea0: 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f  usive-locking mo
1eb0: 64 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c  de, a user-level
1ec0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ed0: 6e 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e  n is .**    open
1ee0: 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  . The database s
1ef0: 69 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20  ize is known in 
1f00: 74 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  this state..**.*
1f10: 2a 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f  *    A connectio
1f20: 6e 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  n running with l
1f30: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d  ocking_mode=norm
1f40: 61 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73  al enters this s
1f50: 74 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20  tate when.**    
1f60: 69 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d  it opens a read-
1f70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f80: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
1f90: 72 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65  returns to state
1fa0: 0a 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65  .**    OPEN afte
1fb0: 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73  r the read-trans
1fc0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65  action is comple
1fd0: 74 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63  ted. However a c
1fe0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  onnection.**    
1ff0: 72 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69  running in locki
2000: 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
2010: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d  e (including tem
2020: 70 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d  p databases) rem
2030: 61 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68  ains in.**    th
2040: 69 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66  is state even af
2050: 74 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61  ter the read-tra
2060: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nsaction is clos
2070: 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79  ed. The only way
2080: 0a 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67  .**    a locking
2090: 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
20a0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74  connection can t
20b0: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52  ransition from R
20c0: 45 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a  EADER to OPEN.**
20d0: 20 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45      is via the E
20e0: 52 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20  RROR state (see 
20f0: 62 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20  below)..** .**  
2100: 20 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73    * A read trans
2110: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63  action may be ac
2120: 74 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74  tive (but a writ
2130: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  e-transaction ca
2140: 6e 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41  nnot)..**    * A
2150: 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
2160: 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  er lock is held 
2170: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2180: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  file..**    * Th
2190: 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  e dbSize variabl
21a0: 65 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64  e may be trusted
21b0: 20 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72   (even if a user
21c0: 2d 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20  -level read .** 
21d0: 20 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e       transaction
21e0: 20 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e   is not active).
21f0: 20 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20   The dbOrigSize 
2200: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
2210: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20  ariables.**     
2220: 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
2230: 74 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ted at this poin
2240: 74 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68  t..**    * If th
2250: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20  e database is a 
2260: 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68  WAL database, th
2270: 65 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65  en the WAL conne
2280: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a  ction is open..*
2290: 2a 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61  *    * Even if a
22a0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
22b0: 6e 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69  n is not open, i
22c0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
22d0: 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68  that .**      th
22e0: 65 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f  ere is no hot-jo
22f0: 75 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c  urnal in the fil
2300: 65 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  e-system..**.** 
2310: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a   WRITER_LOCKED:.
2320: 2a 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67  **.**    The pag
2330: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
2340: 20 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44   state from READ
2350: 45 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d  ER when a write-
2360: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2370: 20 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65    is first opene
2380: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2390: 65 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43  e. In WRITER_LOC
23a0: 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c  KED state, all l
23b0: 6f 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75  ocks .**    requ
23c0: 69 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20  ired to start a 
23d0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
23e0: 6e 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20  n are held, but 
23f0: 6e 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20  no actual .**   
2400: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
2410: 6f 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64  o the cache or d
2420: 61 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b  atabase have tak
2430: 65 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  en place..**.** 
2440: 20 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d     In rollback m
2450: 6f 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20  ode, a RESERVED 
2460: 6f 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73  or (if the trans
2470: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
2480: 64 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45  d with .**    BE
2490: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45  GIN EXCLUSIVE) E
24a0: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
24b0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
24c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
24d0: 68 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67  hen.**    moving
24e0: 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20   to this state, 
24f0: 62 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  but the journal 
2500: 66 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74  file is not writ
2510: 74 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64  ten to or opened
2520: 20 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68   .**    to in th
2530: 69 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  is state. If the
2540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2550: 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
2560: 6c 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a  led back while .
2570: 2a 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f  **    in WRITER_
2580: 4c 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c  LOCKED state, al
2590: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
25a0: 65 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  ed is to unlock 
25b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25c0: 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
25d0: 20 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20     IN WAL mode, 
25e0: 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61  WalBeginWriteTra
25f0: 6e 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61  nsaction() is ca
2600: 6c 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65  lled to lock the
2610: 20 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20   log file..**   
2620: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2630: 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69  on is running wi
2640: 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
2650: 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74  exclusive, an at
2660: 74 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d  tempt.**    is m
2670: 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ade to obtain an
2680: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2690: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26a0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  file..**.**    *
26b0: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
26c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
26d0: 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63  **    * If the c
26e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
26f0: 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f  n in rollback-mo
2700: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2710: 72 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20  r greater .**   
2720: 20 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20     lock is held 
2730: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2740: 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66  file..**    * If
2750: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2760: 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d  is open in WAL-m
2770: 6f 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65  ode, a WAL write
2780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2790: 20 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e       is open (i.
27a0: 65 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67  e. sqlite3WalBeg
27b0: 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  inWriteTransacti
27c0: 6f 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75  on() has been su
27d0: 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20  ccessfully.**   
27e0: 20 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20     called)..**  
27f0: 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20    * The dbSize, 
2800: 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64  dbOrigSize and d
2810: 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62  bFileSize variab
2820: 6c 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69  les are all vali
2830: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63  d..**    * The c
2840: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2850: 61 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20  ager cache have 
2860: 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  not been modifie
2870: 64 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a  d..**    * The j
2880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
2890: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70  or may not be op
28a0: 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68  en..**    * Noth
28b0: 69 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68  ing (not even th
28c0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20  e first header) 
28d0: 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e  has been written
28e0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
28f0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43  .**.**  WRITER_C
2900: 41 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20  ACHEMOD:.**.**  
2910: 20 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20    A pager moves 
2920: 66 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b  from WRITER_LOCK
2930: 45 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73  ED state to this
2940: 20 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61   state when a pa
2950: 67 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73  ge is.**    firs
2960: 74 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68  t modified by th
2970: 65 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49  e upper layer. I
2980: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  n rollback mode 
2990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29a0: 0a 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64  .**    is opened
29b0: 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29c0: 6c 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64  lready open) and
29d0: 20 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65   a header writte
29e0: 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73  n to the.**    s
29f0: 74 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20  tart of it. The 
2a00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
2a10: 20 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65   disk has not be
2a20: 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  en modified..**.
2a30: 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20  **    * A write 
2a40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2a50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
2a60: 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2a70: 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ater lock is hel
2a80: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
2a90: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20  e file..**    * 
2aa0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
2ab0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
2ac0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61   first header ha
2ad0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a  s been written .
2ae0: 2a 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62  **      to it, b
2af0: 75 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61  ut the header ha
2b00: 73 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65  s not been synce
2b10: 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20  d to disk..**   
2b20: 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20   * The contents 
2b30: 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68  of the page cach
2b40: 65 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  e have been modi
2b50: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  fied..**.**  WRI
2b60: 54 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a  TER_DBMOD:.**.**
2b70: 20 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72      The pager tr
2b80: 61 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57  ansitions from W
2b90: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69  RITER_CACHEMOD i
2ba0: 6e 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  nto WRITER_DBMOD
2bb0: 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65   state.**    whe
2bc0: 6e 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68  n it modifies th
2bd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2be0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bf0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   WAL connections
2c00: 0a 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74  .**    never ent
2c10: 65 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73  er this state (s
2c20: 69 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74  ince they do not
2c30: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2c40: 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20  base file,.**   
2c50: 20 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69   just the log fi
2c60: 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  le)..**.**    * 
2c70: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
2c80: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
2c90: 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53  *    * An EXCLUS
2ca0: 49 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c  IVE or greater l
2cb0: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2cc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2cd0: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2cf0: 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  en and the first
2d00: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
2d10: 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20   written .**    
2d20: 20 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20    and synced to 
2d30: 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68  disk..**    * Th
2d40: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d50: 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76  e page cache hav
2d60: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
2d70: 28 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a  (and possibly.**
2d80: 20 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f        written to
2d90: 20 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57   disk)..**.**  W
2da0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
2db0: 2a 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e  **.**    It is n
2dc0: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2dd0: 61 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  a WAL connection
2de0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73   to enter this s
2df0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  tate..**.**    A
2e00: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70   rollback-mode p
2e10: 61 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20  ager changes to 
2e20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2e30: 73 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45  state from WRITE
2e40: 52 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74  R_DBMOD.**    st
2e50: 61 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e  ate after the en
2e60: 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
2e70: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
2e80: 73 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  sfully written i
2e90: 6e 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61  nto the.**    da
2ea0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
2eb0: 74 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74  this state the t
2ec0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
2ed0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70  e committed simp
2ee0: 6c 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61  ly.**    by fina
2ef0: 6c 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  lizing the journ
2f00: 61 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e  al file. Once in
2f10: 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
2f20: 20 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a   state, it is .*
2f30: 2a 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c  *    not possibl
2f40: 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  e to modify the 
2f50: 64 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72  database further
2f60: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
2f70: 20 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20   the upper .**  
2f80: 20 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74    layer must eit
2f90: 68 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  her commit or ro
2fa0: 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
2fb0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
2fc0: 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73   * A write trans
2fd0: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2fe0: 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43  ..**    * An EXC
2ff0: 4c 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65  LUSIVE or greate
3000: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
3010: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3020: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c  ile..**    * All
3030: 20 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e   writing and syn
3040: 63 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  cing of journal 
3050: 61 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74  and database dat
3060: 61 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a  a has finished..
3070: 2a 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72  **      If no er
3080: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 61 6c 6c  ror occured, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48  rt of a OPEN->SH
4530: 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ARED.** transiti
4540: 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65 20  on, by the same 
4550: 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74 68  pager or any oth
4560: 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  er). If the call
4570: 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a   to xUnlock().**
4580: 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20 70   fails at this p
4590: 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61 67  oint and the pag
45a0: 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64 69  er is left holdi
45b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
45c0: 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61  lock, this.** ca
45d0: 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63 61  n confuse the ca
45e0: 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73 65  ll to xCheckRese
45f0: 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20  rvedLock() call 
4600: 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70 61  made later as pa
4610: 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75  rt.** of hot-jou
4620: 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a  rnal detection..
4630: 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73 65  **.** xCheckRese
4640: 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64 65  rvedLock() is de
4650: 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e 69  fined as returni
4660: 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65 72  ng true "if ther
4670: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
4680: 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  .** lock held by
4690: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
46a0: 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53 6f   any others". So
46b0: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
46c0: 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75  ock may .** retu
46d0: 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65 20  rn true because 
46e0: 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65 6c  the caller itsel
46f0: 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  f is holding an 
4700: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28  EXCLUSIVE lock (
4710: 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b  but.** doesn't k
4720: 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20 6f  now it because o
4730: 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72 72  f a previous err
4740: 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20  or in xUnlock). 
4750: 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  If this happens.
4760: 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
4770: 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65 6e   may be mistaken
4780: 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62   for a journal b
4790: 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79 20  eing created by 
47a0: 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  an active.** tra
47b0: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74  nsaction in anot
47c0: 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61 75  her process, cau
47d0: 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20 72  sing SQLite to r
47e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
47f0: 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74  abase.** without
4800: 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b   rolling it back
4810: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
4820: 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
4830: 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  a call to xUnloc
4840: 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 75  k() fails when u
4850: 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20  nlocking the.** 
4860: 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65 20  database in the 
4870: 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61 67  ERROR state, Pag
4880: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
4890: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e  to UNKNOWN_LOCK.
48a0: 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63   It.** is only c
48b0: 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20 61  hanged back to a
48c0: 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74   real locking st
48d0: 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63 63  ate after a succ
48e0: 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74  essful call.** t
48f0: 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56  o xLock(EXCLUSIV
4900: 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f  E). Also, the co
4910: 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50 45  de to do the OPE
4920: 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65 20  N->SHARED state 
4930: 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d  transition.** om
4940: 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66 6f  its the check fo
4950: 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
4960: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
4970: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
4980: 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  _LOCK .** lock. 
4990: 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73 75  Instead, it assu
49a0: 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  mes a hot-journa
49b0: 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62 74  l exists and obt
49c0: 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49 56  ains an EXCLUSIV
49d0: 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  E.** lock on the
49e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
49f0: 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
4a00: 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
4a10: 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a  . See function.*
4a20: 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  * PagerSharedLoc
4a30: 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  k() for more det
4a40: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ail..**.** Pager
4a50: 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20  .eLock may only 
4a60: 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  be set to UNKNOW
4a70: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  N_LOCK when the 
4a80: 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20  pager is in .** 
4a90: 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
4aa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b  ..*/.#define UNK
4ab0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20  NOWN_LOCK       
4ac0: 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55 53           (EXCLUS
4ad0: 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a  IVE_LOCK+1)../*.
4ae0: 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20  ** A macro used 
4af0: 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65  for invoking the
4b00: 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20   codec if there 
4b10: 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66  is one.*/.#ifdef
4b20: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
4b30: 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  C.# define CODEC
4b40: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20  1(P,D,N,X,E) \. 
4b50: 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63     if( P->xCodec
4b60: 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   && P->xCodec(P-
4b70: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d  >pCodec,D,N,X)==
4b80: 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69  0 ){ E; }.# defi
4b90: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4ba0: 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28  X,E,O) \.    if(
4bb0: 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b   P->xCodec==0 ){
4bc0: 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c   O=(char*)D; }el
4bd0: 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d  se \.    if( (O=
4be0: 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65  (char*)(P->xCode
4bf0: 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c  c(P->pCodec,D,N,
4c00: 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a  X)))==0 ){ E; }.
4c10: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 43  #else.# define C
4c20: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29  ODEC1(P,D,N,X,E)
4c30: 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23     /* NO-OP */.#
4c40: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50   define CODEC2(P
4c50: 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63  ,D,N,X,E,O) O=(c
4c60: 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f  har*)D.#endif../
4c70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
4c80: 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72 20   allowed sector 
4c90: 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66 20  size. 64KiB. If 
4ca0: 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65 28  the xSectorsize(
4cb0: 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74  ) method .** ret
4cc0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61 72  urns a value lar
4cd0: 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 74  ger than this, t
4ce0: 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  hen MAX_SECTOR_S
4cf0: 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73 74  IZE is used inst
4d00: 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75  ead..** This cou
4d10: 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 63  ld conceivably c
4d20: 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  ause corruption 
4d30: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65  following a powe
4d40: 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20  r failure on.** 
4d50: 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20 54  such a system. T
4d60: 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c 79  his is currently
4d70: 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   an undocumented
4d80: 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69   limit..*/.#defi
4d90: 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ne MAX_SECTOR_SI
4da0: 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a  ZE 0x10000../*.*
4db0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
4dc0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
4dd0: 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
4de0: 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 61  cated for each a
4df0: 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69  ctive.** savepoi
4e00: 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  nt and statement
4e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
4e20: 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20  the system. All 
4e30: 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73 0a  such structures.
4e40: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
4e50: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
4e60: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77  point[] array, w
4e70: 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65  hich is allocate
4e80: 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64  d and.** resized
4e90: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
4ea0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57  alloc()..**.** W
4eb0: 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
4ec0: 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65 20  is created, the 
4ed0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
4ee0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20  HdrOffset field 
4ef0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20  is.** set to 0. 
4f00: 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  If a journal-hea
4f10: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  der is written i
4f20: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  nto the main jou
4f30: 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68  rnal while.** th
4f40: 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  e savepoint is a
4f50: 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72  ctive, then iHdr
4f60: 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f  Offset is set to
4f70: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
4f80: 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79   .** immediately
4f90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
4fa0: 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ast journal reco
4fb0: 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  rd written into 
4fc0: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72  the main.** jour
4fd0: 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a  nal before the j
4fe0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54  ournal-header. T
4ff0: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
5000: 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  during savepoint
5010: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65  .** rollback (se
5020: 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  e pagerPlaybackS
5030: 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a  avepoint())..*/.
5040: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50  typedef struct P
5050: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61  agerSavepoint Pa
5060: 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74  gerSavepoint;.st
5070: 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70 6f  ruct PagerSavepo
5080: 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66  int {.  i64 iOff
5090: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
50a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67       /* Starting
50b0: 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20   offset in main 
50c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
50d0: 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20   iHdrOffset;    
50e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
50f0: 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76   above */.  Bitv
5100: 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74  ec *pInSavepoint
5110: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;        /* Set 
5120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69 73  of pages in this
5130: 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20   savepoint */.  
5140: 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5160: 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20  Original number 
5170: 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65  of pages in file
5180: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52   */.  Pgno iSubR
5190: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
51a0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
51b0: 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73  irst record in s
51c0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  ub-journal */.#i
51d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
51e0: 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61 6c  T_WAL.  u32 aWal
51f0: 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49  Data[WAL_SAVEPOI
5200: 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20 20  NT_NDATA];      
5210: 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f 69    /* WAL savepoi
5220: 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65  nt context */.#e
5230: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
5240: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5250: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5260: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
5270: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
5280: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
5290: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
52a0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
52b0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
52c0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
52d0: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
52e0: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
52f0: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5300: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5310: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5320: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5330: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5340: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5350: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5360: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
5370: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
5380: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
5390: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
53a0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
53b0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
53c0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
53d0: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
53e0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
53f0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5400: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5410: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5420: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5430: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5440: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5450: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5460: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
5470: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
5480: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
5490: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
54a0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
54b0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
54c0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
54d0: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
54e0: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
54f0: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5500: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5510: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5520: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5530: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5540: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5550: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5560: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
5570: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
5580: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
5590: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
55a0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
55b0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
55c0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
55d0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
55e0: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
55f0: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5600: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5610: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5620: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5630: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5640: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5650: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5660: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
5670: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
5680: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
5690: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
56a0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
56b0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
56c0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
56d0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
56e0: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
56f0: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5700: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5720: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5740: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5750: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5760: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
5770: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5780: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
5790: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
57a0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
57b0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
57c0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
57d0: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
57e0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
57f0: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5800: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5810: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5820: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5830: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5840: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5850: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5860: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
5870: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
5880: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
5890: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
58a0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
58b0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
58c0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
58d0: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
58e0: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
58f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5900: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5910: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5920: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5930: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5940: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5950: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5960: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5970: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5980: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5990: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
59a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
59b0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
59c0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
59d0: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
59e0: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
59f0: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5a00: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5a10: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5a20: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5a30: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5a40: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5a50: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5a60: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5a70: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5a80: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5a90: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5aa0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5ab0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5ac0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5ad0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5ae0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5af0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5b00: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5b10: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5b20: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5b30: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5b40: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5b50: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5b60: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5b70: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5b80: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5b90: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ba0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5bb0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5bc0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5bd0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5be0: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5bf0: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5c00: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5c10: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5c20: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5c30: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5c40: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5c50: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5c60: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5c70: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5c80: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5c90: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5ca0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5cb0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5cc0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5cd0: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5ce0: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5cf0: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5d00: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5d10: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5d20: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5d50: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5d60: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5d70: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5d80: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5d90: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5da0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5db0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5dc0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5dd0: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5de0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5df0: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5e00: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5e10: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5e20: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5e30: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5e40: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5e50: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5e60: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5e70: 69 6c 6c 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70  ill, doNotSyncSp
5e80: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73  ill.**.**   Thes
5e90: 65 20 74 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61  e two boolean va
5ea0: 72 69 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20  riables control 
5eb0: 74 68 65 20 62 65 68 61 76 69 6f 75 72 20 6f 66  the behaviour of
5ec0: 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a   cache-spills.**
5ed0: 20 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62     (calls made b
5ee0: 79 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  y the pcache mod
5ef0: 75 6c 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  ule to the pager
5f00: 53 74 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65  Stress() routine
5f10: 20 74 6f 0a 2a 2a 20 20 20 77 72 69 74 65 20 63   to.**   write c
5f20: 61 63 68 65 64 20 64 61 74 61 20 74 6f 20 74 68  ached data to th
5f30: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e  e file-system in
5f40: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
5f50: 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a  p memory)..**.**
5f60: 20 20 20 57 68 65 6e 20 64 6f 4e 6f 74 53 70 69     When doNotSpi
5f70: 6c 6c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ll is non-zero, 
5f80: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
5f90: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
5fa0: 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 20 20  erStress().**   
5fb0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6c 74 6f  is disabled alto
5fc0: 67 65 74 68 65 72 2e 20 54 68 69 73 20 69 73 20  gether. This is 
5fd0: 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79 20 6f  done in a very o
5fe0: 62 73 63 75 72 65 20 63 61 73 65 20 74 68 61 74  bscure case that
5ff0: 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70 20 64  .**   comes up d
6000: 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 20  uring savepoint 
6010: 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20 72 65  rollback that re
6020: 71 75 69 72 65 73 20 74 68 65 20 70 63 61 63 68  quires the pcach
6030: 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20 74 6f  e module.**   to
6040: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
6050: 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e 74 20  page to prevent 
6060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6070: 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72 69 74   from being writ
6080: 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65 20 69  ten.**   while i
6090: 74 20 69 73 20 62 65 69 6e 67 20 74 72 61 76 65  t is being trave
60a0: 72 73 65 64 20 62 79 20 63 6f 64 65 20 69 6e 20  rsed by code in 
60b0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
60c0: 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 49 66 20 64 6f  ..** .**   If do
60d0: 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 69 73 20  NotSyncSpill is 
60e0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74 69 6e  non-zero, writin
60f0: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6100: 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72 65  e from pagerStre
6110: 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 70 65 72  ss().**   is per
6120: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
6130: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
6140: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 20 54 68 69  file is not. Thi
6150: 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a 2a  s flag is set.**
6160: 20 20 20 62 79 20 73 71 6c 69 74 65 33 50 61 67     by sqlite3Pag
6170: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6180: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6190: 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61  ector-size is la
61a0: 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20 74  rger than.**   t
61b0: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
61c0: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
61d0: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
61e0: 6e 61 6c 20 73 79 6e 63 20 66 72 6f 6d 20 68 61  nal sync from ha
61f0: 70 70 65 6e 69 6e 67 20 0a 2a 2a 20 20 20 69 6e  ppening .**   in
6200: 20 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75   between the jou
6210: 72 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20  rnalling of two 
6220: 70 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  pages on the sam
6230: 65 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a  e sector. .**.**
6240: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a   subjInMemory.**
6250: 0a 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20  .**   This is a 
6260: 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65  boolean variable
6270: 2e 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20  . If true, then 
6280: 61 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62  any required sub
6290: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73  -journal.**   is
62a0: 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
62b0: 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
62c0: 66 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20  file. If false, 
62d0: 74 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  then in-memory.*
62e0: 2a 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73  *   sub-journals
62f0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66   are only used f
6300: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  or in-memory pag
6310: 65 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  er files..**.** 
6320: 20 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20    This variable 
6330: 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
6340: 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61  e upper layer ea
6350: 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a  ch time a new .*
6360: 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61  *   write-transa
6370: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e  ction is opened.
6380: 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64  .**.** dbSize, d
6390: 62 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c  bOrigSize, dbFil
63a0: 65 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61  eSize.**.**   Va
63b0: 72 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73  riable dbSize is
63c0: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
63d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
63e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
63f0: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c  ..**   It is val
6400: 69 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44  id in PAGER_READ
6410: 45 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74  ER and higher st
6420: 61 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73  ates (all states
6430: 20 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20   except for.**  
6440: 20 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29   OPEN and ERROR)
6450: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a  . .**.**   dbSiz
6460: 65 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f  e is set based o
6470: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
6480: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
6490: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
64a0: 2a 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20  *   larger than 
64b0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
64c0: 64 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61  database (the va
64d0: 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66  lue stored at of
64e0: 66 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20  fset.**   28 of 
64f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61  the database hea
6500: 64 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65  der by the btree
6510: 29 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  ). If the size o
6520: 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  f the file.**   
6530: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
6540: 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
6550: 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65  e page-size, the
6560: 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
6570: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
6580: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e  rounded down (i.
6590: 65 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69  e. a 5KB file wi
65a0: 74 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20  th 2K page-size 
65b0: 68 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a  has dbSize==2)..
65c0: 2a 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79  **   Except, any
65d0: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72   file that is gr
65e0: 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
65f0: 65 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f  es in size is co
6600: 6e 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f  nsidered.**   to
6610: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f   have at least o
6620: 6e 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61  ne page. (i.e. a
6630: 20 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   1KB file with 2
6640: 4b 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64  K page-size lead
6650: 73 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65  s.**   to dbSize
6660: 3d 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75  ==1)..**.**   Du
6670: 72 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61  ring a write-tra
6680: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67  nsaction, if pag
6690: 65 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  es with page-num
66a0: 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
66b0: 6e 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72  n.**   dbSize ar
66c0: 65 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68  e modified in th
66d0: 65 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20  e cache, dbSize 
66e0: 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72  is updated accor
66f0: 64 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d  dingly..**   Sim
6700: 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64  ilarly, if the d
6710: 61 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63  atabase is trunc
6720: 61 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72  ated using Pager
6730: 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c  TruncateImage(),
6740: 20 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73   .**   dbSize is
6750: 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
6760: 20 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72    Variables dbOr
6770: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
6780: 65 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20  eSize are valid 
6790: 69 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20  in states .**   
67a0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
67b0: 4b 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20  KED and higher. 
67c0: 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20  dbOrigSize is a 
67d0: 63 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69  copy of the dbSi
67e0: 7a 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65  ze.**   variable
67f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6810: 2e 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72  . It is used dur
6820: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a  ing rollback,.**
6830: 20 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d     and to determ
6840: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6850: 6f 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ot pages need to
6860: 20 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62   be journalled b
6870: 65 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67  efore.**   being
6880: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
6890: 20 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20     Throughout a 
68a0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
68b0: 6e 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  n, dbFileSize co
68c0: 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
68d0: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65  of.**   the file
68e0: 20 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65   on disk in page
68f0: 73 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20  s. It is set to 
6900: 61 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65  a copy of dbSize
6910: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77   when the.**   w
6920: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6930: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
6940: 2c 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68  , and updated wh
6950: 65 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65  en VFS calls are
6960: 20 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72   made.**   to wr
6970: 69 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ite or truncate 
6980: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6990: 65 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a  e on disk. .**.*
69a0: 2a 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61  *   The only rea
69b0: 73 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69  son the dbFileSi
69c0: 7a 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72  ze variable is r
69d0: 65 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75  equired is to su
69e0: 70 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e  ppress .**   unn
69f0: 65 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74  ecessary calls t
6a00: 6f 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66  o xTruncate() af
6a10: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
6a20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
6a30: 2c 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74  , .**   when a t
6a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6a50: 6d 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46  mmitted, the dbF
6a60: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
6a70: 20 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20   indicates .**  
6a80: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
6a90: 73 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65  se file is large
6aa0: 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
6ab0: 61 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72  ase image (Pager
6ac0: 2e 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20  .dbSize), .**   
6ad0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6ae0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20   is called. The 
6af0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6b00: 20 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65   call uses xFile
6b10: 73 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d  size().**   to m
6b20: 65 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62  easure the datab
6b30: 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
6b40: 2c 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63  , and then trunc
6b50: 61 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69  ates it if requi
6b60: 72 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65  red..**   dbFile
6b70: 53 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64  Size is not used
6b80: 20 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   when rolling ba
6b90: 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
6ba0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a  . In this case.*
6bb0: 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61  *   pager_trunca
6bc0: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75  te() is called u
6bd0: 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28  nconditionally (
6be0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72  which means ther
6bf0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20  e may be.**   a 
6c00: 63 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a  call to xFilesiz
6c10: 65 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20  e() that is not 
6c20: 73 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65  strictly require
6c30: 64 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  d). In either ca
6c40: 73 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  se,.**   pager_t
6c50: 72 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61  runcate() may ca
6c60: 75 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  use the file to 
6c70: 62 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f  become smaller o
6c80: 72 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  r larger..**.** 
6c90: 64 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbHintSize.**.**
6ca0: 20 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a     The dbHintSiz
6cb0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  e variable is us
6cc0: 65 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20  ed to limit the 
6cd0: 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
6ce0: 6d 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65  made to.**   the
6cf0: 20 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f   VFS xFileContro
6d00: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6d10: 54 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a  T) method. .**.*
6d20: 2a 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69  *   dbHintSize i
6d30: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6d40: 6f 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61  of the dbSize va
6d50: 72 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a  riable when a.**
6d60: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6d70: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28  tion is opened (
6d80: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6d90: 20 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61   as dbFileSize a
6da0: 6e 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69  nd.**   dbOrigSi
6db0: 7a 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c  ze). If the xFil
6dc0: 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53  eControl(FCNTL_S
6dd0: 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64  IZE_HINT) method
6de0: 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
6df0: 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69   dbHintSize is i
6e00: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
6e10: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
6e20: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20  that correspond 
6e30: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65  to the.**   size
6e40: 2d 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20  -hint passed to 
6e50: 74 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e  the method call.
6e60: 20 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65   See pager_write
6e70: 5f 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20  _pagelist() for 
6e80: 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a  .**   details..*
6e90: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
6ea0: 2a 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65  **   The Pager.e
6eb0: 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20  rrCode variable 
6ec0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
6ed0: 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  d in PAGER_ERROR
6ee0: 20 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20   state. It.**   
6ef0: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69  is set to zero i
6f00: 6e 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  n all other stat
6f10: 65 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52  es. In PAGER_ERR
6f20: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
6f30: 65 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73  errCode .**   is
6f40: 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53   always set to S
6f50: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49  QLITE_FULL, SQLI
6f60: 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20  TE_IOERR or one 
6f70: 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  of the SQLITE_IO
6f80: 45 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75  ERR_XXX .**   su
6f90: 62 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75  b-codes..*/.stru
6fa0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
6fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
6fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
6fd0: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
6fe0: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
6ff0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
7000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
7010: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
7020: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
7030: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
7040: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
7050: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
7060: 68 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  he PAGER_JOURNAL
7070: 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f  MODE_* values */
7080: 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c  .  u8 useJournal
7090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
70a0: 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b  * Use a rollback
70b0: 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73   journal on this
70c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f   file */.  u8 no
70d0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
70e0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
70f0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
7100: 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75  l if true */.  u
7110: 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20  8 fullSync;     
7120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
7130: 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20   extra syncs of 
7140: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
7150: 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20  robustness */.  
7160: 75 38 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  u8 ckptSyncFlags
7170: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
7180: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
7190: 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63  NC_FULL for chec
71a0: 6b 70 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77  kpoint */.  u8 w
71b0: 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  alSyncFlags;    
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
71d0: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
71e0: 55 4c 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74  ULL for wal writ
71f0: 65 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46  es */.  u8 syncF
7200: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
7210: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
7220: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
7230: 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75  otherwise */.  u
7240: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
7250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
7260: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
7270: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
7280: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72a0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
72b0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
72c0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
72d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72e0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
72f0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
7300: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7350: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7360: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7370: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7380: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7390: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
73a0: 6f 75 74 69 6e 65 20 6f 70 65 72 74 69 6f 6e 2e  outine opertion.
73b0: 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73 20    Class members 
73c0: 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f 63  not in this bloc
73d0: 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69 78  k are either fix
73e0: 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  ed.  ** when the
73f0: 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74 20   pager is first 
7400: 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65 20  created or else 
7410: 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65 6e  only change when
7420: 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a 2a   there is a.  **
7430: 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f 64   significant mod
7440: 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20 61  e change (such a
7450: 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 70  s changing the p
7460: 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e  age_size, lockin
7470: 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72 20  g_mode,.  ** or 
7480: 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
7490: 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  ).  From another
74a0: 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c 61   view, these cla
74b0: 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72  ss members descr
74c0: 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73 74  ibe.  ** the "st
74d0: 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67 65  ate" of the page
74e0: 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20 63  r, while other c
74f0: 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73  lass members des
7500: 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20 22  cribe the.  ** "
7510: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20 6f  configuration" o
7520: 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  f the pager..  *
7530: 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20 20  /.  u8 eState;  
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7550: 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20 28  /* Pager state (
7560: 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57 52  OPEN, READER, WR
7570: 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a  ITER_LOCKED..) *
7580: 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20 20  /.  u8 eLock;   
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20  /* Current lock 
75b0: 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73 65  held on database
75c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63 68   file */.  u8 ch
75d0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20  angeCountDone;  
75e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61 66         /* Set af
75f0: 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ter incrementing
7600: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
7610: 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d  ter */.  u8 setM
7620: 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  aster;          
7630: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7640: 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62  a m-j name has b
7650: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
7660: 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f  rnl */.  u8 doNo
7670: 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20 20  tSpill;         
7680: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7690: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 77  pill the cache w
76a0: 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a  hen non-zero */.
76b0: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 53 70    u8 doNotSyncSp
76c0: 69 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ill;          /*
76d0: 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 73 70 69   Do not do a spi
76e0: 6c 6c 20 74 68 61 74 20 72 65 71 75 69 72 65 73  ll that requires
76f0: 20 6a 72 6e 6c 20 73 79 6e 63 20 2a 2f 0a 20 20   jrnl sync */.  
7700: 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8 subjInMemory;
7710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7720: 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65  rue to use in-me
7730: 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  mory sub-journal
7740: 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69  s */.  Pgno dbSi
7750: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7770: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7780: 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  abase */.  Pgno 
7790: 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20 20 20  dbOrigSize;     
77a0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
77b0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
77c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
77d0: 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69 6c 65  */.  Pgno dbFile
77e0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
77f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
7800: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
7810: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
7820: 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b 20 20  no dbHintSize;  
7830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
7840: 75 65 20 70 61 73 73 65 64 20 74 6f 20 46 43 4e  ue passed to FCN
7850: 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63 61 6c  TL_SIZE_HINT cal
7860: 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  l */.  int errCo
7870: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
7880: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
7890: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
78a0: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  rors */.  int nR
78b0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
78c0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6a        /* Pages j
78d0: 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63 65 20  ournalled since 
78e0: 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20 77 72  last j-header wr
78f0: 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32 20 63  itten */.  u32 c
7900: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
7910: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
7920: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
7930: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
7940: 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20 6e 53  ksum */.  u32 nS
7950: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
7960: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7970: 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69 74 74  of records writt
7980: 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72 6e 61  en to sub-journa
7990: 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  l */.  Bitvec *p
79a0: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
79b0: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
79c0: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
79d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
79e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
79f0: 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20 20 20  le *fd;         
7a00: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7a10: 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62 61 73  ptor for databas
7a20: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
7a30: 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
7a40: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
7a50: 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e 20 6a  iptor for main j
7a60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
7a70: 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20  te3_file *sjfd; 
7a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
7a90: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 73  descriptor for s
7aa0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7ab0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7ad0: 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f 66 66  urrent write off
7ae0: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
7af0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
7b00: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
7b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7b20: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
7b30: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
7b40: 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  er */.  sqlite3_
7b50: 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
7b60: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
7b70: 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69 6e  o list of ongoin
7b80: 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  g backup process
7b90: 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  es */.  PagerSav
7ba0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
7bb0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
7bc0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
7bd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
7be0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
7bf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7c00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
7c10: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68  epoint[] */.  ch
7c20: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7c30: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7c40: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7c50: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7c60: 67 65 73 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a  ges */.  /*.  **
7c70: 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74   End of the rout
7c80: 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63  inely-changing c
7c90: 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a  lass members.  *
7ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75  **********/..  u
7cf0: 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  16 nExtra;      
7d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
7d10: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
7d20: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
7d30: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31  ory page */.  i1
7d40: 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  6 nReserve;     
7d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7d60: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
7d70: 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61  tes at end of ea
7d80: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ch page */.  u32
7d90: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
7da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
7db0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
7dc0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75  s.xOpen() */.  u
7dd0: 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  32 sectorSize;  
7de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
7df0: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
7e00: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
7e10: 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  k */.  int pageS
7e20: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
7e30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7e40: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
7e50: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
7e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7e70: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
7e80: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
7e90: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36  database */.  i6
7ea0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
7eb0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
7ec0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
7ed0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
7ee0: 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  iles */.  char *
7ef0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
7f00: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
7f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7f20: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
7f30: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
7f40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
7f50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7f60: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
7f70: 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b  Handler)(void*);
7f80: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
7f90: 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a  call when busy *
7fa0: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48  /.  void *pBusyH
7fb0: 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20  andlerArg;      
7fc0: 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d  /* Context argum
7fd0: 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e  ent for xBusyHan
7fe0: 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  dler */.  int nH
7ff0: 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20  it, nMiss;      
8000: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63        /* Total c
8010: 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69  ache hits and mi
8020: 73 73 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  sses */.#ifdef S
8030: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
8040: 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20   nRead, nWrite; 
8050: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
8060: 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f  base pages read/
8070: 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69  written */.#endi
8080: 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  f.  void (*xRein
8090: 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20  iter)(DbPage*); 
80a0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
80b0: 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64  tine when reload
80c0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66  ing pages */.#if
80d0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
80e0: 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78  ODEC.  void *(*x
80f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
8100: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
8110: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
8120: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
8130: 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63  .  void (*xCodec
8140: 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c  SizeChng)(void*,
8150: 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74  int,int); /* Not
8160: 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65  ify of page size
8170: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f   changes */.  vo
8180: 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
8190: 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20  (void*);        
81a0: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
81b0: 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63  or for the codec
81c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64   */.  void *pCod
81d0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
81e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
81f0: 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e  ent to xCodec...
8200: 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64   methods */.#end
8210: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
8220: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
8230: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
8240: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
8250: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
8260: 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63  .  PCache *pPCac
8270: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  he;            /
8280: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
8290: 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a  e cache object *
82a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
82b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20  _OMIT_WAL.  Wal 
82c0: 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *pWal;          
82d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
82e0: 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20  -ahead log used 
82f0: 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  by "journal_mode
8300: 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20  =wal" */.  char 
8310: 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20  *zWal;          
8320: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e         /* File n
8330: 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68  ame for write-ah
8340: 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69  ead log */.#endi
8350: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f.};../*.** The 
8360: 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
8370: 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20   variables hold 
8380: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f  counters used fo
8390: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72  r.** testing pur
83a0: 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65  poses only.  The
83b0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20  se variables do 
83c0: 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20  not exist in.** 
83d0: 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75  a non-testing bu
83e0: 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69  ild.  These vari
83f0: 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68  ables are not th
8400: 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69  read-safe..*/.#i
8410: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8420: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67  .int sqlite3_pag
8430: 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20  er_readdb_count 
8440: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  = 0;    /* Numbe
8450: 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20  r of full pages 
8460: 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a  read from DB */.
8470: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8480: 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20  r_writedb_count 
8490: 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
84a0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77   of full pages w
84b0: 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a  ritten to DB */.
84c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
84d0: 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d  r_writej_count =
84e0: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
84f0: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
8500: 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  n to journal */.
8510: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
8520: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
8530: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
8540: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
8550: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
8560: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
8570: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
8580: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
8590: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
85a0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
85b0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
85c0: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
85d0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
85e0: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
85f0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
8600: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
8610: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
8620: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
8630: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
8640: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
8650: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
8660: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a  urnal is being.*
8670: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
8680: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
8690: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
86a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
86b0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
86c0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
86d0: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
86e0: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
86f0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
8700: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
8710: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
8720: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
8730: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
8740: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
8750: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
8760: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
8770: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
8780: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
8790: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
87a0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
87b0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
87c0: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
87d0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
87e0: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
87f0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
8800: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
8810: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
8820: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
8830: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
8840: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
8850: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
8860: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
8870: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
8880: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
8890: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
88a0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
88b0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
88c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
88d0: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
88e0: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
88f0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
8900: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
8910: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
8920: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
8930: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
8940: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
8950: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
8960: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
8970: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
8980: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
8990: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
89a0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
89b0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
89c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
89d0: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
89e0: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
89f0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
8a00: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
8a10: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
8a20: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
8a30: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
8a40: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
8a50: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
8a60: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
8a70: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
8a80: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
8a90: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
8aa0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
8ab0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
8ac0: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
8ad0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
8ae0: 68 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  he of each page 
8af0: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f  record in the jo
8b00: 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62  urnal is given b
8b10: 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y.** the followi
8b20: 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65  ng macro..*/.#de
8b30: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
8b40: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
8b50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
8b60: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
8b70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
8b80: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
8b90: 65 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  er. This is usua
8ba0: 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a  lly the same .**
8bb0: 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c   size as a singl
8bc0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
8bd0: 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f  ee also setSecto
8be0: 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  rSize()..*/.#def
8bf0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
8c00: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
8c10: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
8c20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
8c30: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
8c40: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
8c50: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
8c60: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
8c70: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
8c80: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
8c90: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
8ca0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
8cb0: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
8cc0: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
8cd0: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
8ce0: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
8cf0: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
8d00: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
8d10: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
8d20: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
8d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
8d40: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
8d50: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
8d60: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
8d70: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
8d80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
8d90: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
8da0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
8db0: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
8dc0: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
8dd0: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
8de0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
8df0: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
8e00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8e10: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
8e20: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
8e30: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
8e40: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
8e50: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
8e60: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
8e70: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
8e80: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
8e90: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
8ea0: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
8eb0: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
8ec0: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
8ed0: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
8ee0: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
8ef0: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
8f00: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
8f10: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
8f20: 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  hods)../*.** Ret
8f30: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
8f40: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
8f50: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
8f60: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
8f70: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
8f80: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
8f90: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
8fa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8fb0: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
8fc0: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
8fd0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
8fe0: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
8ff0: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
9000: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9010: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
9020: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
9030: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9040: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
9050: 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66  v,w,x,y) 0.# def
9060: 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  ine pagerOpenWal
9070: 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c  IfPresent(z) SQL
9080: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
9090: 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
90a0: 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c  ansaction(z) SQL
90b0: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
90c0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
90d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
90e0: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
90f0: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
9100: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
9110: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
9120: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
9130: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
9140: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
9150: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
9160: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
9170: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
9180: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
9190: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
91a0: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
91b0: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
91c0: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
91d0: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
91e0: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
91f0: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
9200: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9210: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
9220: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9230: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9240: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
9250: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9260: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
9270: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9280: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9290: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
92a0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
92b0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
92c0: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
92d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
92e0: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
92f0: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9300: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9310: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9320: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9330: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9340: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
9350: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
9360: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
9370: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
9380: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
9390: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
93a0: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
93b0: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
93c0: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
93d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
93e0: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
93f0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9400: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9410: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9420: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9430: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9440: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
9450: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
9460: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
9470: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
9480: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
9490: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
94a0: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
94b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
94c0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
94d0: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
94e0: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
94f0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9500: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9510: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9520: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9530: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9540: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9550: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9560: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9570: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9580: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9590: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
95a0: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
95b0: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
95c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
95d0: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
95e0: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
95f0: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9600: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9610: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9620: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9630: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9640: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9650: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9660: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9670: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9680: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9690: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
96a0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
96b0: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
96c0: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
96d0: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
96e0: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
96f0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9700: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9710: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9720: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9730: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9740: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9750: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
9760: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
9770: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9780: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9790: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
97a0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
97b0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
97c0: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
97d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
97e0: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
97f0: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
9800: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
9810: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
9820: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
9830: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
9840: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
9850: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
9860: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
9870: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
9880: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
9890: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
98a0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
98b0: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
98c0: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
98d0: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
98e0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
98f0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
9900: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
9910: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
9920: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
9930: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9940: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9950: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9960: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9970: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9980: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
9990: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
99a0: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
99b0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
99c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
99d0: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
99e0: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
99f0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9a00: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9a10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9a20: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
9a30: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9a40: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9a50: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9a70: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9a80: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
9a90: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9aa0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9ab0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9ac0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
9ad0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
9ae0: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
9af0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
9b00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9b10: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
9b20: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
9b30: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
9b40: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
9b50: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
9b60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9b70: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
9b80: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
9b90: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
9ba0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
9bb0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
9bc0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
9bd0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
9be0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
9bf0: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
9c00: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
9c10: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
9c20: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
9c30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
9c40: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
9c50: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9c60: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9c70: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9c80: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
9c90: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
9ca0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
9cb0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
9cc0: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
9cd0: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
9ce0: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
9cf0: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
9d00: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
9d10: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
9d20: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
9d30: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
9d40: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
9d50: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
9d60: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
9d70: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
9d80: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
9d90: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
9da0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
9db0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
9dc0: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
9dd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
9de0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
9df0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
9e00: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9e10: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9e20: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
9e30: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9e40: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9e50: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
9e60: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
9e70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e80: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
9e90: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
9ea0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
9eb0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
9ec0: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
9ed0: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
9ee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9ef0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9f00: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
9f10: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9f20: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9f30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9f50: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
9f70: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
9f80: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
9f90: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
9fa0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
9fb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
9fc0: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
9fd0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
9fe0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9ff0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a000: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a010: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a020: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a030: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a040: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a050: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a060: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a070: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a080: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a090: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a0a0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a0b0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a0c0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a0d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a0f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a100: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a110: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a120: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a130: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a140: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a150: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a160: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a170: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a180: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a190: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a1a0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a1b0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a1c0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a1d0: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a1e0: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a1f0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a200: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a210: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a220: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a230: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a240: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a250: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a260: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a270: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a280: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a290: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a2b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a2c0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a2d0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a2e0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a2f0: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a300: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a310: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a320: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a330: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a340: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a350: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a360: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a370: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a380: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a390: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a3a0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a3b0: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a3c0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a3d0: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a3e0: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a3f0: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
a400: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
a410: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
a420: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
a430: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
a440: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
a450: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
a460: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
a470: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a480: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
a490: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
a4a0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
a4b0: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
a4c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
a4d0: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
a4e0: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
a4f0: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
a500: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
a510: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
a520: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
a530: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
a540: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
a550: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
a560: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
a570: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
a580: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
a590: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
a5a0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
a5b0: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
a5c0: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
a5d0: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
a5e0: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
a5f0: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
a600: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
a610: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
a620: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
a630: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
a640: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
a650: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
a660: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
a670: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
a680: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
a690: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
a6a0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
a6b0: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
a6c0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
a6d0: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a6e0: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
a6f0: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
a700: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
a710: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a720: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
a730: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
a740: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a750: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
a760: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
a770: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
a780: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
a790: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
a7a0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
a7b0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
a7c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
a7d0: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
a7e0: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
a7f0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
a800: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
a810: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
a820: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
a830: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
a840: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
a850: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
a860: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
a870: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
a880: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
a890: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
a8a0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
a8b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
a8c0: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
a8d0: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
a8e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
a8f0: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
a900: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
a910: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
a920: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
a930: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
a940: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a950: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a960: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
a970: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
a980: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a990: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a9a0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
a9b0: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
a9c0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a9d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
a9e0: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
a9f0: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
aa00: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
aa10: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
aa20: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
aa30: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
aa40: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
aa50: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
aa60: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
aa70: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
aa80: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aa90: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aaa0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
aab0: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
aac0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
aad0: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
aae0: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
aaf0: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
ab00: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
ab10: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
ab20: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
ab30: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
ab40: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
ab50: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
ab60: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
ab70: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
ab80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
ab90: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
aba0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
abb0: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
abc0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
abd0: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
abe0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
abf0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
ac00: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
ac10: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
ac20: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
ac30: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
ac40: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
ac50: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
ac60: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
ac70: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
ac80: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
ac90: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
aca0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
acb0: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
acc0: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
acd0: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
ace0: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
acf0: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
ad00: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
ad10: 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  g){.  Pgno pgno 
ad20: 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50  = pPg->pgno;.  P
ad30: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
ad40: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
ad50: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
ad60: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
ad70: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
ad80: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
ad90: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
ada0: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
adb0: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
adc0: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
add0: 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49  BitvecTest(p->pI
ade0: 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f  nSavepoint, pgno
adf0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
ae00: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
ae10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
ae20: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
ae30: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
ae40: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
ae50: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
ae60: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
ae70: 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70  Journal(PgHdr *p
ae80: 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  Pg){.  return sq
ae90: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
aea0: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e  pPg->pPager->pIn
aeb0: 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
aec0: 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  no);.}../*.** Re
aed0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
aee0: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
aef0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
af00: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
af10: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
af20: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
af30: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
af40: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
af50: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
af60: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
af70: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
af80: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rong..**.** All 
af90: 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
afa0: 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67  d on disk as big
afb0: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74  -endian..*/.stat
afc0: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
afd0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
afe0: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
aff0: 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e  u32 *pRes){.  un
b000: 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34  signed char ac[4
b010: 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ];.  int rc = sq
b020: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
b030: 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20  ac, sizeof(ac), 
b040: 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
b050: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b060: 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69      *pRes = sqli
b070: 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b  te3Get4byte(ac);
b080: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b090: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
b0a0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
b0b0: 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  r into a string 
b0c0: 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e  buffer in big-en
b0d0: 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e  dian byte order.
b0e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33  .*/.#define put3
b0f0: 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69  2bits(A,B)  sqli
b100: 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a  te3Put4byte((u8*
b110: 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  )A,B).../*.** Wr
b120: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
b130: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
b140: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b150: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
b160: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
b170: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
b180: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
b190: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
b1a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
b1b0: 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  te32bits(sqlite3
b1c0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
b1d0: 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b  ffset, u32 val){
b1e0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
b1f0: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
b200: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
b210: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
b220: 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b   ac, 4, offset);
b230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
b240: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b250: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63  le to level eLoc
b260: 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65  k, which must be
b270: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a   either NO_LOCK.
b280: 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  ** or SHARED_LOC
b290: 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  K. Regardless of
b2a0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b2b0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c  the call to xUnl
b2c0: 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64  ock().** succeed
b2d0: 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  s, set the Pager
b2e0: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
b2f0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61 74  to match the (at
b300: 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63  tempted) new loc
b310: 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  k..**.** Except,
b320: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
b330: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
b340: 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73  N_LOCK when this
b350: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
b360: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
b370: 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74 68  odify it. See th
b380: 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20  e comment above 
b390: 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a  the #define of .
b3a0: 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  ** UNKNOWN_LOCK 
b3b0: 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69  for an explanati
b3c0: 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73  on of this..*/.s
b3d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
b3e0: 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70  nlockDb(Pager *p
b3f0: 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b  Pager, int eLock
b400: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
b410: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
b420: 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  rt( !pPager->exc
b430: 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
b440: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f  ager->eLock==eLo
b450: 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ck );.  assert( 
b460: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock==NO_LOCK |
b470: 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  | eLock==SHARED_
b480: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
b490: 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ( eLock!=NO_LOCK
b4a0: 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28   || pagerUseWal(
b4b0: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
b4c0: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
b4d0: 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
b4e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
b4f0: 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20  ock>=eLock );.  
b500: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b510: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
b520: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
b530: 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
b540: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  !=UNKNOWN_LOCK )
b550: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
b560: 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63  eLock = (u8)eLoc
b570: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  k;.    }.    IOT
b580: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
b590: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
b5a0: 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65  eLock)).  }.  re
b5b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
b5c0: 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  * Lock the datab
b5d0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65  ase file to leve
b5e0: 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d  l eLock, which m
b5f0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 53 48  ust be either SH
b600: 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45  ARED_LOCK,.** RE
b610: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
b620: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49  XCLUSIVE_LOCK. I
b630: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
b640: 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
b650: 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f  the.** Pager.eLo
b660: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
b670: 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73  he new locking s
b680: 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63  tate. .**.** Exc
b690: 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c  ept, if Pager.eL
b6a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
b6b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20  KNOWN_LOCK when 
b6c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
b6d0: 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20   .** called, do 
b6e0: 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e  not modify it un
b6f0: 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63  less the new loc
b700: 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20 45 58  king state is EX
b710: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a  CLUSIVE_LOCK. .*
b720: 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  * See the commen
b730: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
b740: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
b750: 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  OCK for an expla
b760: 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68  nation .** of th
b770: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  is..*/.static in
b780: 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61  t pagerLockDb(Pa
b790: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b7a0: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72   eLock){.  int r
b7b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
b7c0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
b7d0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
b7e0: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
b7f0: 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45  LOCK || eLock==E
b800: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
b810: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
b820: 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50  Lock<eLock || pP
b830: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b  ager->eLock==UNK
b840: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
b860: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
b870: 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  eLock);.    if( 
b880: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
b890: 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21   (pPager->eLock!
b8a0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65  =UNKNOWN_LOCK||e
b8b0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
b8c0: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20 70  LOCK) ){.      p
b8d0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
b8e0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  u8)eLock;.      
b8f0: 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
b900: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
b910: 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a 20   eLock)).    }. 
b920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b930: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b940: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
b950: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
b960: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
b970: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
b980: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
b990: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
b9a0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
b9b0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
b9c0: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
b9d0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
b9e0: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
b9f0: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
ba00: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
ba10: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
ba20: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
ba30: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
ba40: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
ba50: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
ba60: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
ba70: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
ba80: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
ba90: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
baa0: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
bab0: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
bac0: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
bad0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
bae0: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
baf0: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
bb00: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
bb10: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
bb20: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
bb30: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
bb40: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
bb50: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
bb60: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
bb70: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
bb80: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
bb90: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
bba0: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
bbb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bbc0: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
bbd0: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
bbe0: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
bbf0: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
bc00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
bc10: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
bc20: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
bc30: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
bc40: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
bc50: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
bc60: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
bc70: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
bc80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bca0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
bcb0: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
bcc0: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
bcf0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
bd00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bd10: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
bd20: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
bd30: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
bd40: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
bd50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
bd60: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
bd70: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
bd80: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
bd90: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
bda0: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
bdb0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
bdc0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
bdd0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
bde0: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
bdf0: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
be00: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
be10: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
be20: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
be30: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
be40: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
be50: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
be60: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
be70: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
be80: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
be90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
bea0: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
beb0: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
bec0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
bed0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
bee0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
bef0: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
bf00: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
bf10: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
bf20: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
bf30: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
bf40: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
bf50: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
bf60: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
bf70: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
bf80: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
bf90: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
bfa0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
bfb0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
bfc0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
bfd0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
bfe0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
bff0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
c000: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
c010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
c020: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
c030: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
c040: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
c050: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
c060: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
c070: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
c080: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
c090: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
c0a0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
c0b0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
c0c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
c0d0: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
c0e0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
c0f0: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
c100: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
c110: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
c120: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
c130: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
c140: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
c150: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
c160: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
c170: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
c180: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
c190: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
c1a0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
c1b0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
c1c0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
c1d0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
c1e0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
c1f0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
c200: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
c210: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
c220: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
c230: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
c240: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
c250: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
c260: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
c270: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
c280: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ger;.  assert( p
c290: 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
c2a0: 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
c2b0: 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
c2c0: 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29  ags&PGHDR_DIRTY)
c2d0: 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73   || pPg->pageHas
c2e0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
c2f0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
c300: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
c310: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
c320: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
c330: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
c340: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65 74  define pager_set
c350: 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64 65  _pagehash(X).#de
c360: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
c370: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
c380: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c390: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
c3a0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
c3b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c3c0: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
c3d0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
c3e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c3f0: 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64  attempts to read
c400: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
c410: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d  l file name from
c420: 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20   the .** end of 
c430: 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66  the file and, if
c440: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70   successful, cop
c450: 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  ies it into memo
c460: 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ry supplied .** 
c470: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53  by the caller. S
c480: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
c490: 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  e writeMasterJou
c4a0: 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66  rnal() for the f
c4b0: 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f  ormat.** used to
c4c0: 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20   store a master 
c4d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c4e0: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
c4f0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
c500: 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75  **.** zMaster mu
c510: 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  st point to a bu
c520: 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
c530: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61   nMaster bytes a
c540: 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
c550: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20  he caller. This 
c560: 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65  should be sqlite
c570: 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
c580: 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68  +1 (to ensure th
c590: 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68  ere is.** enough
c5a0: 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20   space to write 
c5b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
c5c0: 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65  al name). If the
c5d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
c5e0: 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a  ** name in the j
c5f0: 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72  ournal is longer
c600: 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79   than nMaster by
c610: 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61  tes (including a
c620: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
c630: 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69  or), then this i
c640: 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  s handled as if 
c650: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
c660: 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70  l name.** were p
c670: 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f  resent in the jo
c680: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
c690: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c6a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
c6b0: 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  esent at the end
c6c0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
c6d0: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  ** file, then it
c6e0: 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20   is copied into 
c6f0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
c700: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
c710: 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  . A.** nul-termi
c720: 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 70  nator byte is ap
c730: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
c740: 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ffer following t
c750: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
c760: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
c770: 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64  **.** If it is d
c780: 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e  etermined that n
c790: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
c7a0: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
c7b0: 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65  esent .** zMaste
c7c0: 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30  r[0] is set to 0
c7d0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
c7e0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
c7f0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
c800: 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  s while reading 
c810: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
c820: 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65   file, an SQLite
c830: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
c840: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
c850: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
c860: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69  sterJournal(sqli
c870: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c  te3_file *pJrnl,
c880: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
c890: 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20  u32 nMaster){.  
c8a0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
c8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c8c0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
c8d0: 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  32 len;         
c8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
c8f0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20  gth in bytes of 
c900: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c910: 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a  ame */.  i64 szJ
c920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c930: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
c940: 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f  e in bytes of jo
c950: 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c  urnal file pJrnl
c960: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20   /* MJ checksum 
c990: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
c9a0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
c9b0: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
c9c0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
c9d0: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
c9e0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
c9f0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
ca00: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
ca10: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
ca20: 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74  eader */.  zMast
ca30: 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  er[0] = '\0';.. 
ca40: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
ca50: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
ca60: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
ca70: 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c  szJ)).   || szJ<
ca80: 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  16.   || SQLITE_
ca90: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
caa0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
cab0: 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c  16, &len)).   ||
cac0: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20   len>=nMaster . 
cad0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
cae0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
caf0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
cb00: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
cb10: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
cb20: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
cb30: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
cb40: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
cb50: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
cb60: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
cb70: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
cb80: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
cb90: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
cba0: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
cbb0: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
cbc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
cbd0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
cbe0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
cbf0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
cc00: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
cc10: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
cc20: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
cc30: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
cc40: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
cc50: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
cc60: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
cc70: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
cc80: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
cc90: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
cca0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
ccb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ccc0: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
ccd0: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
cce0: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
ccf0: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
cd00: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
cd10: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
cd20: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
cd30: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
cd40: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
cd50: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
cd60: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
cd70: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
cd80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cd90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
cda0: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
cdb0: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
cdc0: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
cdd0: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
cde0: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
cdf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ce00: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
ce10: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
ce20: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
ce30: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
ce40: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
ce50: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
ce60: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
ce70: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
ce80: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
ce90: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
cec0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
cee0: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
cf00: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf20: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
cf50: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
cf60: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
cf70: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
cf80: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
cf90: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
cfa0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
cfb0: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
cfc0: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
cfd0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
cfe0: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
cff0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
d000: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
d010: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
d020: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
d030: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
d040: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
d050: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
d060: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d070: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
d080: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
d090: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
d0a0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
d0b0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
d0c0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
d0d0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d0e0: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
d0f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d100: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
d110: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
d120: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
d130: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
d140: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
d150: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
d160: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
d170: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
d180: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
d190: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
d1a0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
d1b0: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
d1c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d1d0: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
d1e0: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
d1f0: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
d200: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
d210: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d220: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d230: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
d240: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
d250: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
d260: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
d270: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
d280: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
d290: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
d2a0: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
d2b0: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
d2c0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
d2d0: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
d2e0: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
d2f0: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
d300: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
d310: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
d320: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
d330: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
d340: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
d350: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
d360: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
d370: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
d380: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
d390: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
d3a0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d3b0: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
d3c0: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
d3d0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
d3e0: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
d3f0: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
d400: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
d410: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
d420: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
d430: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
d440: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
d450: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
d460: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
d470: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
d480: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
d490: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
d4a0: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
d4b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d4e0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
d4f0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
d500: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
d510: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
d520: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
d530: 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d    const i64 iLim
d540: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  it = pPager->jou
d550: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20  rnalSizeLimit;  
d560: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
d570: 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20   of jsl */..    
d580: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
d590: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
d5a0: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
d5b0: 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d  ncate || iLimit=
d5c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
d5d0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
d5e0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
d5f0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
d600: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
d610: 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32  t char zeroHdr[2
d620: 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20  8] = {0};.      
d630: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
d640: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
d650: 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66   zeroHdr, sizeof
d660: 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20  (zeroHdr), 0);. 
d670: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
d680: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
d690: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
d6a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d6b0: 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
d6c0: 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59  ->jfd, SQLITE_SY
d6d0: 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67  NC_DATAONLY|pPag
d6e0: 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
d6f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
d700: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
d710: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
d720: 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65  ommitted but the
d730: 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20   write lock .   
d740: 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c   ** is still hel
d750: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  d on the file. I
d760: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a  f there is a siz
d770: 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72  e limit configur
d780: 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74  ed for .    ** t
d790: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  he persistent jo
d7a0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f  urnal and the jo
d7b0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
d7c0: 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f  ntly consumes mo
d7d0: 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  re.    ** space 
d7e0: 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20  than that limit 
d7f0: 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e  allows for, trun
d800: 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
d810: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
d820: 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65    ** to sync the
d830: 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20   file following 
d840: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
d850: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
d860: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d870: 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20  iLimit>0 ){.    
d880: 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20    i64 sz;.      
d890: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
d8a0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
d8b0: 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20  fd, &sz);.      
d8c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d8d0: 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29  K && sz>iLimit )
d8e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
d8f0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
d900: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c  (pPager->jfd, iL
d910: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  imit);.      }. 
d920: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d930: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
d940: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d950: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
d960: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
d970: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
d980: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
d990: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
d9a0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
d9b0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
d9c0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
d9d0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
d9e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
d9f0: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
da00: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
da10: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
da20: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
da30: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
da40: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
da50: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
da60: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
da70: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
da80: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
da90: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
daa0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
dab0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
dac0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
dad0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
dae0: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
daf0: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
db00: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
db10: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
db20: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
db30: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
db40: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
db50: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
db60: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
db70: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
db80: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
db90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
dba0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
dbb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
dbc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
dbd0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
dbe0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
dbf0: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
dc00: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
dc10: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f  r->pTmpSpace;  /
dc20: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63  * Temporary spac
dc30: 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  e used to build 
dc40: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
dc50: 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70  nHeader = (u32)p
dc60: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
dc70: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
dc80: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
dc90: 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32  zHeader */.  u32
dca0: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61   /* Bytes of hea
dcd0: 64 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74  der sector writt
dce0: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20  en */.  int ii; 
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
dd10: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
dd20: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
dd30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
dd40: 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c        /* Journal
dd50: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
dd60: 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48  en. */..  if( nH
dd70: 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44  eader>JOURNAL_HD
dd80: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
dd90: 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f      nHeader = JO
dda0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ddb0: 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
ddc0: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74  If there are act
ddd0: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
dde0: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77  nd any of them w
ddf0: 65 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a  ere created .  *
de00: 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74  * since the most
de10: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
de20: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
de30: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a  en, update the .
de40: 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
de50: 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66  int.iHdrOffset f
de60: 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ields now..  */.
de70: 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
de80: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
de90: 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66  t; ii++){.    if
dea0: 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70  ( pPager->aSavep
deb0: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
dec0: 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  set==0 ){.      
ded0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
dee0: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
def0: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
df00: 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
df10: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
df20: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
df30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
df40: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
df50: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a  pPager);..  /* .
df60: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
df70: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
df80: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
df90: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
dfa0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
dfb0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
dfc0: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
dfd0: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
dfe0: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
dff0: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
e000: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
e010: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
e020: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
e030: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
e040: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
e050: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
e060: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
e070: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
e080: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
e090: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
e0a0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
e0b0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
e0c0: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
e0d0: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
e0e0: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
e0f0: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
e100: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
e110: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
e120: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
e130: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
e140: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
e150: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
e160: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
e170: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
e180: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
e190: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
e1a0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
e1b0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
e1c0: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
e1d0: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
e1e0: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
e1f0: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
e200: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
e210: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
e220: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
e230: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
e240: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e250: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
e260: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
e270: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
e280: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
e290: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
e2a0: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
e2b0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
e2c0: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
e2d0: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
e2e0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
e2f0: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
e300: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
e310: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
e320: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
e330: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
e340: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
e350: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
e360: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
e370: 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nc );.  if( pPag
e380: 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70  er->noSync || (p
e390: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
e3a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
e3b0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
e3c0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
e3d0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
e3e0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
e3f0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e400: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
e410: 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64      memcpy(zHead
e420: 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  er, aJournalMagi
e430: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
e440: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70  alMagic));.    p
e450: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e460: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e470: 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66  lMagic)], 0xffff
e480: 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffff);.  }else{.
e490: 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64      memset(zHead
e4a0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a  er, 0, sizeof(aJ
e4b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b  ournalMagic)+4);
e4c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
e4d0: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
e4e0: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
e4f0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
e500: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
e510: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
e520: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
e530: 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74  nit);.  put32bit
e540: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e550: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e560: 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  +4], pPager->cks
e570: 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68  umInit);.  /* Th
e580: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
e590: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  se size */.  put
e5a0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e5b0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e5c0: 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72  agic)+8], pPager
e5d0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20  ->dbOrigSize);. 
e5e0: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
e5f0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
e600: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
e610: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
e620: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
e630: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20  rnalMagic)+12], 
e640: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
e650: 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70  ze);..  /* The p
e660: 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  age size */.  pu
e670: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
e680: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
e690: 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67  Magic)+16], pPag
e6a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
e6b0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e    /* Initializin
e6c0: 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  g the tail of th
e6d0: 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  e buffer is not 
e6e0: 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72  necessary.  Ever
e6f0: 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b  ything.  ** work
e700: 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f  s find if the fo
e710: 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29  llowing memset()
e720: 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75   is omitted.  Bu
e730: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20  t initializing. 
e740: 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70   ** the memory p
e750: 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64  revents valgrind
e760: 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e   from complainin
e770: 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c  g, so we are wil
e780: 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b  ling to.  ** tak
e790: 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  e the performanc
e7a0: 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65  e hit..  */.  me
e7b0: 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69  mset(&zHeader[si
e7c0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e7d0: 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20  ic)+20], 0,.    
e7e0: 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69       nHeader-(si
e7f0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e800: 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20  ic)+20));..  /* 
e810: 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73  In theory, it is
e820: 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20   only necessary 
e830: 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20  to write the 28 
e840: 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a  bytes that the .
e850: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
e860: 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20  der consumes to 
e870: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e880: 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72   here. Then incr
e890: 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20  ement the .  ** 
e8a0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
e8b0: 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55   variable by JOU
e8c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74  RNAL_HDR_SZ so t
e8d0: 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20  hat the next .  
e8e0: 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69  ** record is wri
e8f0: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c  tten to the foll
e900: 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65  owing sector (le
e910: 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74  aving a gap in t
e920: 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61  he file.  ** tha
e930: 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63  t will be implic
e940: 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62  itly filled in b
e950: 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a  y the OS)..  **.
e960: 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20    ** However it 
e970: 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65  has been discove
e980: 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65  red that on some
e990: 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61   systems this pa
e9a0: 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20  ttern can .  ** 
e9b0: 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79  be significantly
e9c0: 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e   slower than con
e9d0: 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e  tiguously writin
e9e0: 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  g data to the fi
e9f0: 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  le,.  ** even if
ea00: 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c   that means expl
ea10: 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64  icitly writing d
ea20: 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b  ata to the block
ea30: 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e   of .  ** (JOURN
ea40: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
ea50: 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bytes that will 
ea60: 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20  not be used. So 
ea70: 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a  that is what.  *
ea80: 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a  * is done. .  **
ea90: 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69  .  ** The loop i
eaa0: 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20  s required here 
eab0: 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74  in case the sect
eac0: 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65  or-size is large
ead0: 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a  r than the .  **
eae0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73   database page s
eaf0: 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a  ize. Since the z
eb00: 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73  Header buffer is
eb10: 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65   only Pager.page
eb20: 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20  Size.  ** bytes 
eb30: 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68  in size, more th
eb40: 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73  an one call to s
eb50: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20  qlite3OsWrite() 
eb60: 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a  may be required.
eb70: 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65    ** to populate
eb80: 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
eb90: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
eba0: 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e  r..  */ .  for(n
ebb0: 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c  Write=0; rc==SQL
ebc0: 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a  ITE_OK&&nWrite<J
ebd0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ebe0: 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e  ager); nWrite+=n
ebf0: 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54  Header){.    IOT
ec00: 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
ec10: 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
ec20: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
ec30: 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29  alHdr, nHeader))
ec40: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ec50: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
ec60: 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e  >jfd, zHeader, n
ec70: 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e  Header, pPager->
ec80: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20  journalOff);.   
ec90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
eca0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
ecb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ecc0: 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  f );.    pPager-
ecd0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e  >journalOff += n
ece0: 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72  Header;.  }..  r
ecf0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ed00: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
ed10: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
ed20: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
ed30: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
ed40: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
ed50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
ed60: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
ed70: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
ed80: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
ed90: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
eda0: 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  The current loca
edb0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
edc0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65  nal file is give
edd0: 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  n by.** pPager->
ede0: 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20  journalOff. See 
edf0: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
ee00: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
ee10: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a  rnalHdr() for.**
ee20: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
ee30: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ee40: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
ee50: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
ee60: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
ee70: 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73  fully, *pNRec is
ee80: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
ee90: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
eea0: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
eeb0: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
eec0: 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20  *pDbSize is set 
eed0: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
eee0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
eef0: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
ef00: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
ef10: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
ef20: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
ef30: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
ef40: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
ef50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
ef60: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
ef70: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
ef80: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
ef90: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
efa0: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
efb0: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
efc0: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
efd0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
efe0: 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a  and *pNRec and *
eff0: 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65  PDbSize are unde
f000: 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e  fined.  If JOURN
f010: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
f020: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
f030: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
f040: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
f050: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
f060: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f070: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
f080: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
f090: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f0a0: 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
f0b0: 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a  */.  int isHot,.
f0c0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
f0d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
f0e0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70  * Size of the op
f0f0: 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
f100: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
f110: 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20  2 *pNRec,       
f120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
f130: 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72  T: Value read fr
f140: 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  om the nRec fiel
f150: 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53  d */.  u32 *pDbS
f160: 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
f170: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f180: 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61  e of original da
f190: 74 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c  tabase size fiel
f1a0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
f1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f1c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
f1d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67   code */.  unsig
f1e0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
f1f0: 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66  8];     /* A buf
f200: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
f210: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
f220: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f240: 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72  * Offset of jour
f250: 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67  nal header being
f260: 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65   read */..  asse
f270: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
f280: 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20  r->jfd) );      
f290: 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  /* Journal file 
f2a0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f  must be open. */
f2b0: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50  ..  /* Advance P
f2c0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
f2d0: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
f2e0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e  the next sector.
f2f0: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75   If the.  ** jou
f300: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f  rnal file is too
f310: 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65   small for there
f320: 20 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20   to be a header 
f330: 73 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20  stored at this. 
f340: 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72   ** point, retur
f350: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
f360: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   */.  pPager->jo
f370: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
f380: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
f390: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
f3a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
f3b0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
f3c0: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
f3d0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
f3e0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f3f0: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
f400: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f410: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
f420: 74 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65  the first 8 byte
f430: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
f440: 20 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79   header. If they
f450: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20   do not match.  
f460: 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74  ** the  magic st
f470: 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68  ring found at th
f480: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20  e start of each 
f490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
f4a0: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
f4b0: 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49  TE_DONE. If an I
f4c0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
f4d0: 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
f4e0: 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
f4f0: 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20  .  ** proceed.. 
f500: 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20   */.  if( isHot 
f510: 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67  || iHdrOff!=pPag
f520: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29  er->journalHdr )
f530: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
f540: 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
f550: 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69  >jfd, aMagic, si
f560: 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48  zeof(aMagic), iH
f570: 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20  drOff);.    if( 
f580: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
f590: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
f5a0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
f5b0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
f5c0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
f5d0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ))!=0 ){.      r
f5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
f5f0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
f600: 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  /* Read the firs
f610: 74 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66  t three 32-bit f
f620: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75  ields of the jou
f630: 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65  rnal header: The
f640: 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64   nRec.  ** field
f650: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69  , the checksum-i
f660: 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74  nitializer and t
f670: 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
f680: 20 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20   at the start.  
f690: 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  ** of the transa
f6a0: 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e  ction. Return an
f6b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
f6c0: 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
f6d0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53  ng..  */.  if( S
f6e0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f6f0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
f700: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
f710: 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c  8, pNRec)).   ||
f720: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f730: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f740: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f750: 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63  f+12, &pPager->c
f760: 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c  ksumInit)).   ||
f770: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f780: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f790: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f7a0: 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a  f+16, pDbSize)).
f7b0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
f7c0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
f7d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f7e0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  f==0 ){.    u32 
f7f0: 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20  iPageSize;      
f800: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f810: 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
f820: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
f830: 0a 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72  .    u32 iSector
f840: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
f850: 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65    /* Sector-size
f860: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
f870: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20  l header */..   
f880: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
f890: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
f8a0: 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68  r-size journal h
f8b0: 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f  eader fields. */
f8c0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
f8d0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
f8e0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
f8f0: 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69  , iHdrOff+20, &i
f900: 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20  SectorSize)).   
f910: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
f920: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
f930: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
f940: 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65  drOff+24, &iPage
f950: 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20  Size)).    ){.  
f960: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
f980: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
f990: 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73  prior to 3.5.8 s
f9a0: 65 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  et the page-size
f9b0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20   field of the.  
f9c0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
f9d0: 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20  der to zero. In 
f9e0: 74 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d  this case, assum
f9f0: 65 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72  e that the Pager
fa00: 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a  .pageSize.    **
fa10: 20 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72   variable is alr
fa20: 65 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20  eady set to the 
fa30: 63 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a  correct page siz
fa40: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
fa50: 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29  ( iPageSize==0 )
fa60: 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a  {.      iPageSiz
fa70: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
fa80: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Size;.    }..   
fa90: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
faa0: 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66  he values read f
fab0: 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a  rom the page-siz
fac0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fad0: 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20  e fields.    ** 
fae0: 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
faf0: 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67  . To be 'in rang
fb00: 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20  e', both values 
fb10: 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  need to be a pow
fb20: 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f  er.    ** of two
fb30: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
fb40: 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72   equal to 512 or
fb50: 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65   32, and not gre
fb60: 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20  ater than their 
fb70: 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69  .    ** respecti
fb80: 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  ve compile time 
fb90: 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a  maximum limits..
fba0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
fbb0: 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20  PageSize<512    
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
fbd0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a   iSectorSize<32.
fbe0: 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a       || iPageSiz
fbf0: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
fc00: 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f  E_SIZE || iSecto
fc10: 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52  rSize>MAX_SECTOR
fc20: 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28  _SIZE.     || ((
fc30: 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61  iPageSize-1)&iPa
fc40: 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20  geSize)!=0   || 
fc50: 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29  ((iSectorSize-1)
fc60: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30  &iSectorSize)!=0
fc70: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
fc80: 2a 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20  * If the either 
fc90: 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72  the page-size or
fca0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20   sector-size in 
fcb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
fcc0: 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  er is .      ** 
fcd0: 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68  invalid, then th
fce0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
fcf0: 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  rote the journal
fd00: 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76  -header must hav
fd10: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73  e .      ** cras
fd20: 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68  hed before the h
fd30: 65 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64  eader was synced
fd40: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73  . In this case s
fd50: 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20  top reading .   
fd60: 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
fd70: 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  l file here..   
fd80: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
fd90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
fda0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70      }..    /* Up
fdb0: 64 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69  date the page-si
fdc0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
fdd0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
fde0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  the journal. .  
fdf0: 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63    ** Use a testc
fe00: 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d  ase() macro to m
fe10: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61  ake sure that ma
fe20: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74  lloc failure wit
fe30: 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  hin .    ** Page
fe40: 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69  rSetPagesize() i
fe50: 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f  s tested..    */
fe60: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
fe70: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
fe80: 65 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65  e(pPager, &iPage
fe90: 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Size, -1);.    t
fea0: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
feb0: 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
fec0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
fed0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
fee0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
fef0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20  lue used by .   
ff00: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
ff10: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
ff20: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
ff30: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
ff40: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79     ** created by
ff50: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
ff60: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
ff70: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
ff80: 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e  e.    ** is bein
ff90: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
ffa0: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
ffb0: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
ffc0: 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
ffd0: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
ffe0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
fff0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
10000 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
10010 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
10020 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f  torSize = iSecto
10030 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50  rSize;.  }..  pP
10040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10050 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
10060 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
10070 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
10080 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
10090 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
100a0 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
100b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
100c0 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
100d0 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
100e0 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
100f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10100 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
10110 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
10120 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
10130 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
10140 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
10150 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
10160 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
10170 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
10180 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
10190 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
101a0 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
101b0 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
101c0 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
101d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79  :.**.**   + 4 by
101e0 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
101f0 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74  NO..**   + N byt
10200 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10210 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75  al filename in u
10220 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tf-8..**   + 4 b
10230 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20  ytes: N (length 
10240 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
10250 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c  l name in bytes,
10260 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   no nul-terminat
10270 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  or)..**   + 4 by
10280 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
10290 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
102a0 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65  m..**   + 8 byte
102b0 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
102c0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
102d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
102e0 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
102f0 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
10300 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
10310 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
10320 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74  , where each byt
10330 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
10340 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62   as a signed 8-b
10350 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
10360 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
10370 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
10380 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
10390 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
103a0 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
103b0 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
103c0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
103d0 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
103e0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
103f0 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
10400 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
10410 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10430 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
10440 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20    int nMaster;  
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
10470 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
10480 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
104b0 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72  f header in jour
104c0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
104d0 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20  4 jrnlSize;     
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
104f0 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
10500 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a  l file on disk *
10510 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  /.  u32 cksum = 
10520 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10530 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
10540 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
10550 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
10560 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10570 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er==0 );.  asser
10580 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
10590 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
105a0 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c  ( !zMaster .   |
105b0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
105c0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
105d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
105e0 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
105f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
10600 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
10610 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  F .  ){.    retu
10620 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10630 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  }.  pPager->setM
10640 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73  aster = 1;.  ass
10650 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
10660 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73  er->jfd) );.  as
10670 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
10680 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
10690 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
106a0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
106b0 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
106c0 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
106d0 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
106e0 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
106f0 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
10700 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
10710 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
10720 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10730 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
10740 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
10750 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
10760 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
10770 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
10780 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
10790 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
107a0 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
107b0 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
107c0 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
107d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
107e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
107f0 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
10800 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
10810 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
10820 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
10830 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
10840 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
10850 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
10860 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
10870 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
10880 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
10890 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
108a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
108b0 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
108c0 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
108d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
108e0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
108f0 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
10900 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
10910 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10920 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
10930 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
10940 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10950 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10960 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
10970 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
10980 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
10990 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
109a0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
109b0 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
109c0 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
109d0 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
109e0 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
109f0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10a00 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
10a10 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
10a20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10a30 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
10a40 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
10a50 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20  ournalMagic, 8, 
10a60 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
10a70 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  r+8))).  ){.    
10a80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
10a90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10aa0 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b  Off += (nMaster+
10ab0 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  20);..  /* If th
10ac0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65  e pager is in pe
10ad0 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20  ristent-journal 
10ae0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70  mode, then the p
10af0 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f  hysical .  ** jo
10b00 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65  urnal-file may e
10b10 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65  xtend past the e
10b20 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  nd of the master
10b30 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20  -journal name.  
10b40 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f  ** and 8 bytes o
10b50 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73  f magic data jus
10b60 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
10b70 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a   file. This is .
10b80 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62    ** dangerous b
10b90 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20  ecause the code 
10ba0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f  to rollback a ho
10bb0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  t-journal file. 
10bc0 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   ** will not be 
10bd0 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65  able to find the
10be0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
10bf0 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
10c00 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  e .  ** whether 
10c10 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
10c20 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a  al is hot. .  **
10c30 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68  .  ** Easiest th
10c40 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69  ing to do in thi
10c50 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f  s scenario is to
10c60 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
10c70 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
10c80 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64   to the required
10c90 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69   size..  */ .  i
10ca0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  f( SQLITE_OK==(r
10cb0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10cc0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
10cd0 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20  d, &jrnlSize)). 
10ce0 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50    && jrnlSize>pP
10cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10d00 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  .  ){.    rc = s
10d10 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
10d20 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
10d30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10d40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10d50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  rc;.}../*.** Fin
10d60 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
10d70 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
10d80 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
10d90 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f  . Return.** a po
10da0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
10db0 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  e or NULL if the
10dc0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
10dd0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61  is not .** alrea
10de0 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  dy in memory..*/
10df0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
10e00 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
10e10 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
10e20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
10e30 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
10e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10e50 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20  turn value */.. 
10e60 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f   /* It is not po
10e70 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c  ssible for a cal
10e80 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68  l to PcacheFetch
10e90 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c  () with createFl
10ea0 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61  ag==0 to.  ** fa
10eb0 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74  il, since no att
10ec0 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  empt to allocate
10ed0 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
10ee0 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20  will be made..  
10ef0 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  */.  (void)sqlit
10f00 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
10f10 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
10f20 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72  gno, 0, &p);.  r
10f30 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
10f40 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e  * Discard the en
10f50 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
10f60 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   the in-memory p
10f70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74  age-cache..*/.st
10f80 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
10f90 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
10fa0 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 42  ger){.  sqlite3B
10fb0 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
10fc0 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
10fd0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
10fe0 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
10ff0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  che);.}../*.** F
11000 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
11010 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
11020 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
11030 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
11040 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
11050 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11060 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
11070 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
11080 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
11090 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
110a0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
110b0 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
110c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
110d0 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
110e0 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
110f0 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
11100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11110 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
11120 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
11130 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
11140 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11150 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11160 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
11170 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
11180 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
11190 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
111a0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
111b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
111c0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
111d0 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61  lite3IsMemJourna
111e0 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  l(pPager->sjfd) 
111f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11200 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
11210 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
11220 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
11230 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
11240 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11250 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11260 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
11270 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
11280 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
11290 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
112a0 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
112b0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
112c0 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
112d0 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
112e0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
112f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11300 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
11310 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
11320 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
11330 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
11340 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
11350 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
11360 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
11370 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
11380 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
11390 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
113a0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
113b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
113c0 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
113d0 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
113e0 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
113f0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
11400 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
11410 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
11420 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11430 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
11440 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
11450 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
11460 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
11470 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
11480 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
11490 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
114a0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
114b0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
114c0 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
114d0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
114e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
114f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
11500 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11510 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
11520 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
11530 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74 0a 2a  e mode and not.*
11540 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  * in the ERROR s
11550 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
11560 20 69 74 20 73 77 69 74 63 68 65 73 20 74 68 65   it switches the
11570 20 70 61 67 65 72 20 74 6f 20 50 41 47 45 52 5f   pager to PAGER_
11580 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a  OPEN.** state..*
11590 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
115a0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
115b0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
115c0 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
115d0 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d 70 6c  file is.** compl
115e0 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  etely unlocked. 
115f0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  If the file is u
11600 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20  nlocked and the 
11610 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f 65 73  file-system does
11620 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69 74 20  .** not exhibit 
11630 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c 45 5f  the UNDELETABLE_
11640 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70 65 72  WHEN_OPEN proper
11650 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ty, the journal 
11660 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f 73 65  file is.** close
11670 64 20 28 69 66 20 69 74 20 69 73 20 6f 70 65 6e  d (if it is open
11680 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
11690 70 61 67 65 72 20 69 73 20 69 6e 20 45 52 52 4f  pager is in ERRO
116a0 52 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  R state when thi
116b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
116c0 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20 63 6f  lled, the .** co
116d0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
116e0 67 65 72 20 63 61 63 68 65 20 61 72 65 20 64 69  ger cache are di
116f0 73 63 61 72 64 65 64 20 62 65 66 6f 72 65 20 73  scarded before s
11700 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20 74 6f  witching back to
11710 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20 73 74   .** the OPEN st
11720 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73 73 20  ate. Regardless 
11730 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 70  of whether the p
11740 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
11750 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f 72 20  sive-mode.** or 
11760 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e 61 6c  not, any journal
11770 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20 74 68   file left in th
11780 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 77 69  e file-system wi
11790 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a 2a 2a  ll be treated.**
117a0 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
117b0 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
117c0 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20  k the next time 
117d0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
117e0 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65 64 20  on.** is opened 
117f0 28 62 79 20 74 68 69 73 20 6f 72 20 62 79 20 61  (by this or by a
11800 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ny other connect
11810 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ion)..*/.static 
11820 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
11830 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
11840 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
11850 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11860 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20 20 20  ER_READER .     
11870 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
11880 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
11890 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
118a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
118b0 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a 20 20  _ERROR .  );..  
118c0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
118d0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
118e0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
118f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
11900 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c   0;.  releaseAll
11910 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65  Savepoints(pPage
11920 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72  r);..  if( pager
11930 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
11940 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
11950 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
11960 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d) );.    sqlite
11970 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73  3WalEndReadTrans
11980 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
11990 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Wal);.    pPager
119a0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
119b0 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
119c0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
119d0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
119e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11a00 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72 65 74  * Error code ret
11a10 75 72 6e 65 64 20 62 79 20 70 61 67 65 72 55 6e  urned by pagerUn
11a20 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20 20 20  lockDb() */.    
11a30 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70 65 6e  int iDc = isOpen
11a40 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73 71 6c  (pPager->fd)?sql
11a50 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
11a60 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
11a70 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20 20 20  er->fd):0;..    
11a80 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74  /* If the operat
11a90 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ing system suppo
11aa0 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66 20 6f  rt deletion of o
11ab0 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65 6e 0a  pen files, then.
11ac0 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74 68 65      ** close the
11ad0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
11ae0 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
11af0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 20 20  database lock.  
11b00 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
11b10 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
11b20 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
11b30 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
11b40 68 74 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ht delete the fi
11b50 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20 66 72  le.    ** out fr
11b60 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
11b70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
11b80 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
11b90 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20 35 29  DE_MEMORY   & 5)
11ba0 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=1 );.    asser
11bb0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
11bc0 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 26  LMODE_OFF      &
11bd0 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73   5)!=1 );.    as
11be0 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
11bf0 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20  RNALMODE_WAL    
11c00 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
11c10 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
11c20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
11c30 54 45 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  TE   & 5)!=1 );.
11c40 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
11c50 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
11c60 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d 31 20  RUNCATE & 5)==1 
11c70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
11c80 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11c90 45 5f 50 45 52 53 49 53 54 20 20 26 20 35 29 3d  E_PERSIST  & 5)=
11ca0 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  =1 );.    if( 0=
11cb0 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49  =(iDc & SQLITE_I
11cc0 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
11cd0 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20 20 20  _WHEN_OPEN).    
11ce0 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72 2d 3e   || 1!=(pPager->
11cf0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 35 29  journalMode & 5)
11d00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
11d10 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
11d20 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
11d30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
11d40 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
11d50 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20  ERROR state and 
11d60 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 6c 6f  the call to unlo
11d70 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
11d80 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61 69 6c      ** file fail
11d90 73 2c 20 73 65 74 20 74 68 65 20 63 75 72 72 65  s, set the curre
11da0 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b 4e 4f  nt lock to UNKNO
11db0 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74 68 65  WN_LOCK. See the
11dc0 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a 2a 20   comment.    ** 
11dd0 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
11de0 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  e for UNKNOWN_LO
11df0 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  CK for an explan
11e00 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74 68 69  ation of why thi
11e10 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65 63 65  s.    ** is nece
11e20 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ssary..    */.  
11e30 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 6c 6f    rc = pagerUnlo
11e40 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e 4f 5f  ckDb(pPager, NO_
11e50 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
11e60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
11e70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11e80 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b 0a 20  PAGER_ERROR ){. 
11e90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
11ea0 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ck = UNKNOWN_LOC
11eb0 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
11ec0 20 54 68 65 20 70 61 67 65 72 20 73 74 61 74 65   The pager state
11ed0 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65 64 20   may be changed 
11ee0 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52 4f 52  from PAGER_ERROR
11ef0 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 68   to PAGER_OPEN h
11f00 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74 68 6f  ere.    ** witho
11f10 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20  ut clearing the 
11f20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 69 73  error code. This
11f30 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 20   is intentional 
11f40 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  - the error.    
11f50 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65 61 72  ** code is clear
11f60 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
11f70 20 72 65 73 65 74 20 69 6e 20 74 68 65 20 62 6c   reset in the bl
11f80 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a  ock below..    *
11f90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
11fa0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
11fb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
11fc0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
11fd0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
11fe0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
11ff0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12000 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12010 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 50  ;.  }..  /* If P
12020 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20  ager.errCode is 
12030 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  set, the content
12040 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
12050 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20  ache cannot be. 
12060 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
12070 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
12080 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
12090 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
120a0 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69 74 20   pager,.  ** it 
120b0 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76 65 20  can safely move 
120c0 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 4f 50  back to PAGER_OP
120d0 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73 20 68  EN state. This h
120e0 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68 0a 20  appens in both. 
120f0 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64 20 65   ** normal and e
12100 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69 6e 67  xclusive-locking
12110 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   mode..  */.  if
12120 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12130 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
12140 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
12150 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
12160 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
12170 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12180 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
12190 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  le;.    pPager->
121a0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f  eState = PAGER_O
121b0 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  PEN;.    pPager-
121c0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
121d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  E_OK;.  }..  pPa
121e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
121f0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 0;.  pPager->j
12200 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
12210 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
12220 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er = 0;.}../*.**
12230 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12240 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65  s called wheneve
12250 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55  r an IOERR or FU
12260 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65  LL error that re
12270 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61  quires.** the pa
12280 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ger to transitio
12290 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  n into the ERROR
122a0 20 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20   state may ahve 
122b0 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65  occurred..** The
122c0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
122d0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
122e0 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
122f0 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ure, the second 
12300 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  .** the error-co
12310 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
12320 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
12330 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
12340 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72   The .** value r
12350 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
12360 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
12370 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
12380 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
12390 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
123a0 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
123b0 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  TE_FULL, SQLITE_
123c0 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20  IOERR or one of 
123d0 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62  the.** IOERR sub
123e0 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65  -codes, the page
123f0 72 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52  r enters the ERR
12400 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  OR state and the
12410 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
12420 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  s stored in Page
12430 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65  r.errCode. While
12440 20 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69   the pager remai
12450 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20  ns in the ERROR 
12460 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61  state,.** all ma
12470 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e  jor API calls on
12480 20 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20   the Pager will 
12490 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
124a0 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  rn Pager.errCode
124b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f  ..**.** The ERRO
124c0 52 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65  R state indicate
124d0 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
124e0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
124f0 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f  -cache .** canno
12500 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68  t be trusted. Th
12510 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20  is state can be 
12520 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c  cleared by compl
12530 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67  etely discarding
12540 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74   .** the content
12550 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12560 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73  ache. If a trans
12570 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76  action was activ
12580 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65  e when.** the pe
12590 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f  rsistent error o
125a0 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68  ccurred, then th
125b0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
125c0 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
125d0 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
125e0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
125f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
12600 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
12610 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
12620 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
12630 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12640 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
12650 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
12660 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
12670 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  0xff;.  assert( 
12680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
12690 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
126a0 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67  ert(.       pPag
126b0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
126c0 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
126d0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
126e0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
126f0 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d  .       (pPager-
12700 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29  >errCode & 0xff)
12710 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
12720 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53   );.  if( rc2==S
12730 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63  QLITE_FULL || rc
12740 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  2==SQLITE_IOERR 
12750 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
12760 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
12770 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12780 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20  = PAGER_ERROR;. 
12790 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
127a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
127b0 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
127c0 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
127d0 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
127e0 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
127f0 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
12800 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
12810 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
12820 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
12830 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
12840 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
12850 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
12860 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
12870 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
12880 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12890 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
128a0 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
128b0 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
128c0 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
128d0 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54  action..** .** T
128e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
128f0 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 50  ever called in P
12900 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
12910 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c 65  . If it is calle
12920 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e 4f  d.** in PAGER_NO
12930 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41 52  NE or PAGER_SHAR
12940 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68 65  ED state and the
12950 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c 65   lock held is le
12960 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  ss.** exclusive 
12970 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44 20  than a RESERVED 
12980 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e 6f  lock, it is a no
12990 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  -op..**.** Other
129a0 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65  wise, any active
129b0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
129c0 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
129d0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
129e0 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ile is open, the
129f0 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a  n it is "finaliz
12a00 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72  ed". Once a jour
12a10 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73  nal .** file has
12a20 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
12a30 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
12a40 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20  le to use it to 
12a50 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20  roll back a .** 
12a60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72  transaction. Nor
12a70 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73   will it be cons
12a80 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20 68  idered to be a h
12a90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68  ot-journal by th
12aa0 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68  is.** or any oth
12ab0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
12ac0 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20  ection. Exactly 
12ad0 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73  how a journal is
12ae0 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65   finalized.** de
12af0 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72  pends on whether
12b00 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65   or not the page
12b10 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
12b20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
12b30 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  nd.** the curren
12b40 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28  t journal-mode (
12b50 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
12b60 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c  e value), as fol
12b70 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  lows:.**.**   jo
12b80 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
12b90 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  Y.**     Journal
12ba0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12bb0 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65   is simply close
12bc0 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79 73  d. This destroys
12bd0 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d   an .**     in-m
12be0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  emory journal..*
12bf0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
12c00 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20  de==TRUNCATE.** 
12c10 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
12c20 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
12c30 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
12c40 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ize..**.**   jou
12c50 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
12c60 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72  T.**     The fir
12c70 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20 74  st 28 bytes of t
12c80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12c90 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73  are zeroed. This
12ca0 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20   invalidates.** 
12cb0 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f      the first jo
12cc0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
12cd0 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65  the file, and he
12ce0 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a  nce the entire j
12cf0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
12d00 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a  le. An invalid j
12d10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e  ournal file cann
12d20 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
12d30 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  k..**.**   journ
12d40 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a  alMode==DELETE.*
12d50 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  *     The journa
12d60 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
12d70 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69   and deleted usi
12d80 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
12d90 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  te()..**.**     
12da0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
12db0 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
12dc0 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20  sive mode, this 
12dd0 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69  method of finali
12de0 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20  zing.**     the 
12df0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12e00 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74  never used. Inst
12e10 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  ead, if the jour
12e20 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20  nalMode is.**   
12e30 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65    DELETE and the
12e40 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
12e50 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
12e60 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62 65   method describe
12e70 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a  d under.**     j
12e80 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12e90 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73 74  IST is used inst
12ea0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ead..**.** After
12eb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12ec0 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 70  finalized, the p
12ed0 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
12ee0 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65  GER_READER state
12ef0 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20  ..** If running 
12f00 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65  in non-exclusive
12f10 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20   rollback mode, 
12f20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
12f30 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77 6e  file is .** down
12f40 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41 52  graded to a SHAR
12f50 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53  ED_LOCK..**.** S
12f60 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
12f70 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
12f80 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
12f90 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
12fa0 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
12fb0 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
12fc0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
12fd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
12fe0 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
12ff0 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
13000 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
13010 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
13020 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
13030 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
13040 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
13050 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
13060 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
13070 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
13080 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
13090 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
130a0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
130b0 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
130c0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
130d0 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
130e0 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
130f0 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
13100 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
13110 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
13120 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
13130 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
13140 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
13150 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13160 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
13170 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
13180 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29  , int hasMaster)
13190 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
131a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
131b0 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
131c0 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
131d0 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
131e0 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
131f0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
13200 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
13210 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
13220 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
13230 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
13240 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
13250 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
13260 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13270 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
13280 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
13290 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
132a0 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
132b0 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
132c0 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
132d0 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
132e0 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
132f0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
13300 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
13310 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
13320 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
13330 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
13340 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
13350 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
13360 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
13370 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
13380 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
13390 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
133a0 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
133b0 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
133c0 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
133d0 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
133e0 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
133f0 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
13400 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
13410 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
13420 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
13430 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
13440 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
13450 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
13460 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13470 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
13480 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
13490 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
134a0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
134b0 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
134c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
134d0 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
134e0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
134f0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
13500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
13510 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
13520 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
13530 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
13540 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
13550 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
13560 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
13570 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
13580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
13590 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
135a0 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
135b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
135c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
135d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
135e0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69  ournal==0 );.  i
135f0 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
13600 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73  ->jfd) ){.    as
13610 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
13620 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
13630 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
13640 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13650 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
13660 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
13670 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
13690 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
136a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
136b0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
136c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
136d0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
136e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
136f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13700 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13710 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
13720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
13730 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
13750 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13770 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13780 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
13790 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
137a0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
137b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
137c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
137d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
137e0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
137f0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
13800 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
13810 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
13820 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13830 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
13840 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
13850 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
13860 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
13870 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
13880 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13890 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
138a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
138b0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
138c0 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20  may be executed 
138d0 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e  with Pager.journ
138e0 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69  alMode==MEMORY i
138f0 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74  f.      ** a hot
13900 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73  -journal was jus
13910 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  t rolled back. I
13920 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
13930 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
13940 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
13950 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74  closed and delet
13960 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e  ed. If this conn
13970 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f  ection writes to
13980 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
13990 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
139a0 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67  will do so using
139b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
139c0 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f  urnal. .      */
139d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
139e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
139f0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a00 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20  LMODE_DELETE .  
13a10 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67           || pPag
13a20 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13a30 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13a40 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20  DE_MEMORY .     
13a50 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13a60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13a70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13a80 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20  WAL .      );.  
13a90 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13aa0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13ab0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
13ac0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
13ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13ae0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
13af0 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
13b00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
13b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13b20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
13b30 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
13b40 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
13b50 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
13b60 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
13b70 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
13b80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
13b90 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  Size==0 && sqlit
13ba0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
13bb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
13bc0 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  )>0 ){.    PgHdr
13bd0 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b   *p = pager_look
13be0 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  up(pPager, 1);. 
13bf0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
13c00 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20    p->pageHash = 
13c10 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
13c20 50 61 67 65 72 55 6e 72 65 66 28 70 29 3b 0a 20  PagerUnref(p);. 
13c30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13c40 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
13c50 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
13c60 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  pInJournal);.  p
13c70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
13c80 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
13c90 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c  >nRec = 0;.  sql
13ca0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
13cb0 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
13cc0 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  he);.  sqlite3Pc
13cd0 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
13ce0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
13cf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a  ager->dbSize);..
13d00 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
13d10 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
13d20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c   /* Drop the WAL
13d30 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20   write-lock, if 
13d40 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  any. Also, if th
13d50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
13d60 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b   in .    ** lock
13d70 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
13d80 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e  ve mode but is n
13d90 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74  o longer, drop t
13da0 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  he EXCLUSIVE .  
13db0 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f    ** lock held o
13dc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
13dd0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
13de0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
13df0 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
13e00 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
13e10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
13e20 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
13e30 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
13e40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
13e50 65 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72  e .   && (!pager
13e60 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c  UseWal(pPager) |
13e70 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  | sqlite3WalExcl
13e80 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
13e90 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b  ->pWal, 0)).  ){
13ea0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
13eb0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
13ec0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
13ed0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
13ee0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
13ef0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53    }.  pPager->eS
13f00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
13f10 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  DER;.  pPager->s
13f20 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  etMaster = 0;.. 
13f30 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
13f40 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a  ITE_OK?rc2:rc);.
13f50 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
13f60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
13f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
13f80 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
13f90 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
13fa0 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
13fb0 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
13fc0 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
13fd0 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
13fe0 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
13ff0 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
14000 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
14010 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
14020 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
14030 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
14040 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
14050 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
14060 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
14070 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
14080 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
14090 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65  nd move the page
140a0 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  r back to OPEN s
140b0 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a  tate. If this .*
140c0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
140d0 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
140e0 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
140f0 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
14100 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63   next .** connec
14110 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61  tion to obtain a
14120 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
14130 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68  the pager (which
14140 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65   may be this one
14150 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20  ) .** will roll 
14160 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  it back..**.** I
14170 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
14180 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65  not already ente
14190 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74  red the ERROR st
141a0 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f  ate, but an IO o
141b0 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  r.** malloc erro
141c0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
141d0 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  a rollback, then
141e0 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c   this will itsel
141f0 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20  f cause .** the 
14200 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74  pager to enter t
14210 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
14220 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c  Which will be cl
14230 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  eared by the.** 
14240 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
14250 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72  lock(), as descr
14260 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73  ibed above..*/.s
14270 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
14280 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
14290 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
142a0 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
142b0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
142c0 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ROR && pPager->e
142d0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
142e0 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
142f0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
14300 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
14310 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
14320 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
14330 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  TER_LOCKED ){.  
14340 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
14350 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
14360 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14370 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
14380 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
14390 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
143a0 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ();.    }else if
143b0 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
143c0 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
143d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
143e0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
143f0 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20  READER );.      
14400 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
14410 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29  ction(pPager, 0)
14420 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14430 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14440 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
14450 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
14460 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
14470 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
14480 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
14490 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
144a0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
144b0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
144c0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
144d0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
144e0 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
144f0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14500 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14510 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14520 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14530 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14540 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
14550 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
14560 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
14570 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
14580 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
14590 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
145a0 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
145b0 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
145c0 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
145d0 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
145e0 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
145f0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14600 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
14610 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
14620 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
14630 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
14640 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
14650 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
14660 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
14670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
14680 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
14690 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
146a0 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
146b0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
146c0 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
146d0 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
146e0 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
146f0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
14700 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
14710 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
14720 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
14730 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
14740 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
14750 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
14760 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
14770 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
14780 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
14790 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
147a0 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
147b0 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
147c0 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
147d0 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
147e0 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
147f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
14800 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
14810 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
14820 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
14830 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
14840 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
14850 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
14860 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
14870 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
14880 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14890 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
148a0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
148b0 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
148c0 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
148d0 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
148e0 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
148f0 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
14900 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
14910 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
14920 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
14930 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
14940 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
14950 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
14960 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
14970 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
14980 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
14990 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
149a0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
149b0 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
149c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
149d0 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
149e0 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
149f0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
14a20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
14a30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
14a40 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
14a50 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
14a60 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
14a70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
14a80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
14a90 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
14aa0 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
14ab0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
14ac0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
14ad0 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
14ae0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
14af0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
14b00 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
14b10 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
14b20 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
14b30 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
14b40 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
14b50 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
14b60 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
14b70 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
14b80 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
14b90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
14ba0 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
14bb0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
14bc0 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
14bd0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
14be0 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
14bf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
14c00 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
14c10 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
14c20 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
14c30 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
14c40 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
14c50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
14c60 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
14c70 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
14c80 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
14c90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
14ca0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
14cb0 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
14cc0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
14cd0 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
14ce0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
14cf0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
14d00 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
14d10 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
14d20 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
14d30 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
14d40 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
14d50 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
14d60 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
14d70 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
14d80 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
14d90 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
14da0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
14db0 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
14dc0 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
14dd0 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
14de0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
14df0 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
14e00 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
14e10 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
14e20 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
14e30 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
14e40 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
14e50 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
14e60 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
14e70 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
14e80 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
14e90 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
14ea0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
14eb0 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
14ec0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14ed0 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
14ee0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
14ef0 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
14f00 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
14f10 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
14f20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
14f30 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
14f40 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
14f50 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
14f60 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
14f70 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
14f80 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
14f90 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
14fa0 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
14fb0 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
14fc0 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
14fd0 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
14fe0 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
14ff0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
15000 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
15010 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15020 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
15030 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15040 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
15050 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
15060 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
15070 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
15080 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
15090 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
150a0 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
150b0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
150c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
150d0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
150e0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
150f0 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
15100 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
15110 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
15120 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
15130 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15140 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
15150 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
15160 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
15170 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
15180 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
15190 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
151a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
151c0 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
151d0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
151e0 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
15210 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
15220 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15230 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15240 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
15250 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
15260 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15270 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
15280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15290 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
152a0 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
152b0 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
152c0 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
152d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
152e0 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
152f0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
15300 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
15310 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
15320 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15330 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15340 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
15350 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
15360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15370 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
15380 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
15390 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
153a0 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
153b0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
153c0 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
153d0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
153e0 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15410 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15420 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15430 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15440 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
15450 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
15460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15470 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
15480 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
15490 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
154a0 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
154b0 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
154c0 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
154d0 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
154e0 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
154f0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15500 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15510 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15520 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15530 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15540 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
15550 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
15560 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
15570 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
15580 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
15590 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
155a0 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
155b0 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
155c0 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
155d0 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
155e0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
155f0 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15600 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
15610 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
15620 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
15630 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
15640 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
15650 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
15660 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
15670 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
15680 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
15690 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
156a0 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
156b0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
156c0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
156d0 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
156e0 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
156f0 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
15700 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
15710 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
15720 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
15730 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
15740 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
15750 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
15760 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
15770 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
15780 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
15790 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
157a0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
157b0 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
157c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
157d0 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
157e0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
157f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
15800 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
15810 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
15820 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
15830 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
15840 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
15850 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
15860 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
15870 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
15880 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
15890 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
158a0 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
158b0 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
158c0 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
158d0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
158e0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
158f0 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
15900 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
15910 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
15920 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
15930 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
15940 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
15950 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
15960 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
15970 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
15980 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
15990 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
159a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
159b0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
159c0 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
159d0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
159e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
159f0 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
15a00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15a10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
15a20 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
15a30 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
15a40 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
15a50 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
15a60 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
15a70 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
15a80 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
15a90 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
15aa0 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
15ab0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
15ac0 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
15ad0 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
15ae0 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
15af0 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
15b00 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
15b10 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
15b20 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
15b30 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
15b40 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
15b50 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
15b60 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
15b70 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
15b80 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
15b90 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
15ba0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
15bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
15bc0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
15bd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
15be0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
15bf0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
15c00 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
15c10 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
15c20 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
15c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15c40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
15c50 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
15c60 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
15c70 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
15c80 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
15c90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15ca0 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
15cb0 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
15cc0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
15cd0 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
15ce0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15cf0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
15d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
15d10 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
15d20 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
15d30 20 62 79 20 62 65 66 6f 72 65 20 64 75 72 69 6e   by before durin
15d40 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  g the current.  
15d50 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  ** rollback, the
15d60 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74  n don't bother t
15d70 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61  o play it back a
15d80 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  gain..  */.  if(
15d90 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
15da0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
15db0 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
15dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
15de0 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69  .  /* When playi
15df0 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20  ng back page 1, 
15e00 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73  restore the nRes
15e10 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a  erve setting.  *
15e20 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  /.  if( pgno==1 
15e30 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  && pPager->nRese
15e40 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61  rve!=((u8*)aData
15e50 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61  )[20] ){.    pPa
15e60 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  ger->nReserve = 
15e70 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d  ((u8*)aData)[20]
15e80 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
15e90 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
15ea0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
15eb0 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43 48  pager is in CACH
15ec0 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e  EMOD state, then
15ed0 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
15ee0 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
15ef0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
15f00 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
15f10 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
15f20 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
15f30 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
15f40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15f50 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
15f60 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
15f70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
15f80 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
15f90 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
15fa0 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
15fb0 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
15fc0 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
15fd0 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
15fe0 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
15ff0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
16000 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
16010 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
16020 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16030 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
16040 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
16050 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
16060 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
16070 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
16080 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
16090 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
160a0 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
160b0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
160c0 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
160d0 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
160e0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
160f0 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
16100 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f  ** If in WRITER_
16110 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49  DBMOD, WRITER_FI
16120 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73  NISHED or OPEN s
16130 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
16140 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61  date the.  ** pa
16150 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
16160 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d  exists and the m
16170 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
16180 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
16190 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74  d .  ** not dirt
161a0 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f  y. Since this co
161b0 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75  de is only execu
161c0 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  ted in PAGER_OPE
161d0 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a  N state for.  **
161e0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
161f0 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67  ollback, it is g
16200 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
16210 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69 73  he page-cache is
16220 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74   empty.  ** if t
16230 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f  he pager is in O
16240 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a  PEN state..  **.
16250 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
16260 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
16270 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
16280 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
16290 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
162a0 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
162b0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
162c0 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
162d0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
162e0 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
162f0 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
16300 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
16310 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
16320 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
16330 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
16340 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
16350 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
16360 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
16370 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
16380 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
16390 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
163a0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
163b0 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
163c0 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
163d0 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
163e0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
163f0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
16400 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
16410 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
16420 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
16430 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
16440 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
16450 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
16460 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
16470 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
16480 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16490 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
164a0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
164b0 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
164c0 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
164d0 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
164e0 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
164f0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
16500 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
16510 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
16520 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
16530 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
16540 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
16550 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
16560 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
16570 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
16580 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
16590 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
165a0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
165b0 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
165c0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
165d0 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
165e0 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
165f0 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
16600 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
16610 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
16620 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
16630 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
16640 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
16650 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
16660 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
16670 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
16680 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
16690 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
166a0 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
166b0 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
166c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67  ..  */.  if( pag
166d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
166e0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
166f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
16700 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
16710 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
16720 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
16730 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
16740 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16750 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
16760 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 29 3b  PEN || pPg==0 );
16770 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
16780 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
16790 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25   %d hash(%08x) %
167a0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
167b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
167c0 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
167d0 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
167e0 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44  ageSize, (u8*)aD
167f0 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ata),.          
16800 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61   (isMainJrnl?"ma
16810 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62  in-journal":"sub
16820 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b  -journal").  ));
16830 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
16840 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  l ){.    isSynce
16850 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  d = pPager->noSy
16860 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20  nc || (*pOffset 
16870 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
16880 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  alHdr);.  }else{
16890 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20  .    isSynced = 
168a0 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
168b0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
168c0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20  R_NEED_SYNC));. 
168d0 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28   }.  if( isOpen(
168e0 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26  pPager->fd).   &
168f0 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
16900 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
16910 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
16920 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
16930 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e  PEN).   && isSyn
16940 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ced.  ){.    i64
16950 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
16960 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
16970 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74  geSize;.    test
16980 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e 74  case( !isSavepnt
16990 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28 70   && pPg!=0 && (p
169a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
169b0 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b  NEED_SYNC)!=0 );
169c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61  .    assert( !pa
169d0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
169e0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) );.    rc = sq
169f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
16a00 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44  ger->fd, (u8*)aD
16a10 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
16a20 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20  eSize, ofst);.  
16a30 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
16a40 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
16a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
16a60 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
16a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16a80 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
16a90 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28  ){.      CODEC1(
16aa0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
16ab0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
16ac0 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20  E_NOMEM);.      
16ad0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
16ae0 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
16af0 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29  kup, pgno, (u8*)
16b00 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 43 4f  aData);.      CO
16b10 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
16b20 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
16b30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44  SQLITE_NOMEM, aD
16b40 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ata);.    }.  }e
16b50 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a  lse if( !isMainJ
16b60 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b  rnl && pPg==0 ){
16b70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
16b80 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  is a rollback of
16b90 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64   a savepoint and
16ba0 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72   data was not wr
16bb0 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20  itten to.    ** 
16bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
16bd0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
16be0 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72   in-memory, ther
16bf0 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c  e is a potential
16c00 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e  .    ** problem.
16c10 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   When the page i
16c20 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20 62  s next fetched b
16c30 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79  y the b-tree lay
16c40 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77  er, it .    ** w
16c50 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
16c60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16c70 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  le, which may or
16c80 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20   may not be .   
16c90 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20   ** current. .  
16ca0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72    **.    ** Ther
16cb0 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f  e are a couple o
16cc0 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73  f different ways
16cd0 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   this can happen
16ce0 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a  . All are quite.
16cf0 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20      ** obscure. 
16d00 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20  When running in 
16d10 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
16d20 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  , this can only 
16d30 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69  happen .    ** i
16d40 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e  f the page is on
16d50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
16d60 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
16d70 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
16d80 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75  then.    ** popu
16d90 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65  lated, then move
16da0 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50  d using sqlite3P
16db0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a  agerMovepage()..
16dc0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
16dd0 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f  e solution is to
16de0 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   add an in-memor
16df0 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63 61  y page to the ca
16e00 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20  che containing. 
16e10 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a     ** the data j
16e20 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ust read from th
16e30 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d  e sub-journal. M
16e40 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16e50 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e  dirty .    ** an
16e60 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  d if the pager r
16e70 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61  equires a journa
16e80 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72  l-sync, then mar
16e90 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a 20  k the page as . 
16ea0 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20     ** requiring 
16eb0 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62  a journal-sync b
16ec0 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
16ed0 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
16ee0 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
16ef0 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t );.    assert(
16f00 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
16f10 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ill==0 );.    pP
16f20 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
16f30 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ++;.    rc = sql
16f40 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
16f50 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
16f60 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pPg, 1);.    ass
16f70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
16f80 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20  otSpill==1 );.  
16f90 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
16fa0 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69 66 28 20  pill--;.    if( 
16fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
16fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
16fd0 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
16fe0 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
16ff0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17000 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
17010 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
17020 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
17030 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
17040 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
17050 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
17060 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
17070 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
17080 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
17090 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
170a0 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
170b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
170c0 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
170d0 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
170e0 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
170f0 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
17100 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
17110 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
17120 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
17130 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
17140 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
17150 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
17160 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
17170 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
17180 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
17190 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
171a0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
171b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
171c0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
171d0 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
171e0 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
171f0 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
17200 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
17210 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
17220 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17230 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
17240 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
17250 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
17260 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
17270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
17280 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
17290 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
172a0 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
172b0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
172c0 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
172d0 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
172e0 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
172f0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
17300 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
17310 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
17320 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
17330 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20  it out to the.  
17340 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
17350 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17360 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
17370 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
17380 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70  s rule. If the p
17390 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  age is being rol
173a0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  led.      ** bac
173b0 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73  k as part of a s
173c0 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61  avepoint (or sta
173d0 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b  tement) rollback
173e0 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20   from an .      
173f0 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  ** unsynced port
17400 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ion of the main 
17410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17420 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  en it is not saf
17430 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e.      ** to ma
17440 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
17450 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65  lean. This is be
17460 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68  cause marking th
17470 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20  e page as.      
17480 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c  ** clean will cl
17490 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
174a0 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69  ED_SYNC flag. Si
174b0 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a  nce the page is.
174c0 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
174d0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
174e0 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69  file (recorded i
174f0 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
17500 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  al) and.      **
17510 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
17520 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65  SYNC flag is cle
17530 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67  ared, if the pag
17540 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  e is written to.
17550 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
17560 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
17570 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  action, it will 
17580 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
17590 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  ty but.      ** 
175a0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
175b0 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f  YNC flag will no
175c0 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75  t be set. It cou
175d0 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61  ld then potentia
175e0 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  lly.      ** be 
175f0 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f  written out into
17600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17610 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f  le before its jo
17620 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
17630 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73   ** segment is s
17640 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73  ynced. If a cras
17650 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
17660 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  or following thi
17670 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  s,.      ** data
17680 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
17690 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20  may ensue..     
176a0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
176b0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
176c0 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
176d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
176e0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
176f0 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
17700 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
17710 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
17720 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
17730 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
17740 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
17750 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
17760 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
17770 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
17780 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
17790 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
177a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
177b0 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
177c0 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
177d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
177e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
177f0 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
17800 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
17810 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
17820 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
17830 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
17840 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
17850 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
17860 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
17870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
17890 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
178a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
178b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
178c0 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
178d0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
178e0 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
178f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17900 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
17910 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
17920 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17930 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
17940 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
17950 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
17960 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
17970 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
17980 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
17990 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
179a0 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
179b0 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
179c0 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
179d0 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
179e0 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
179f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
17a00 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
17a10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
17a20 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
17a30 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
17a40 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
17a50 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
17a60 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
17a70 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
17a80 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
17a90 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
17aa0 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
17ab0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
17ac0 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
17ad0 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
17ae0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
17af0 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
17b00 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
17b10 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
17b20 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
17b30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
17b40 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
17b50 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
17b60 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
17b70 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
17b80 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
17b90 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
17ba0 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
17bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
17bc0 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
17bd0 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
17be0 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
17bf0 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
17c00 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
17c10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
17c20 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
17c30 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
17c40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
17c50 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
17c60 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
17c70 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
17c80 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
17c90 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
17ca0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
17cb0 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
17cc0 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
17cd0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
17ce0 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
17cf0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
17d00 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
17d10 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
17d20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
17d30 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
17d40 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a 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 20 74 68 61 74 20 6d 61 74 63   found that matc
17d70 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
17d80 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
17d90 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
17da0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
17db0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
17dc0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
17dd0 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
17de0 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
17df0 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
17e00 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
17e10 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
17e20 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
17e30 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
17e40 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
17e50 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
17e60 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
17e70 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
17e80 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
17e90 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
17ea0 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
17eb0 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
17ec0 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
17ed0 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
17ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
17ef0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
17f00 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
17f10 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
17f20 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
17f30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
17f40 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
17f50 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
17f60 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
17f70 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
17f80 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
17f90 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
17fa0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
17fb0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
17fc0 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
17fd0 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
17fe0 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
17ff0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
18000 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
18010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18020 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
18030 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
18040 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
18050 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
18060 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
18070 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
18080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18090 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
180a0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
180b0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
180c0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
180d0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
180e0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
180f0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
18100 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
18110 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
18120 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
18130 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
18140 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
18150 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
18160 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
18170 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
18180 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
18190 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
181a0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
181b0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
181c0 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
181d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
181e0 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
181f0 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
18200 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18210 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
18220 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
18230 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
18240 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18250 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
18260 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
18270 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
18280 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
18290 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
182a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
182b0 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
182c0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
182d0 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
182e0 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
182f0 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
18300 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18310 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
18320 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
18330 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
18340 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
18350 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
18360 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
18370 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
18380 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
18390 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
183a0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
183b0 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
183c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
183d0 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
183e0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
183f0 67 73 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45  gs = .#if SQLITE
18400 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
18410 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 28 70  TECTION.      (p
18420 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
18430 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
18440 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
18450 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 28  |.#endif.      (
18460 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18470 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
18480 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
18490 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
184a0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
184b0 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
184c0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
184d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
184e0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
184f0 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
18500 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
18510 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18520 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
18530 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
18540 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
18550 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
18560 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
18570 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
18580 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
18590 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
185a0 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
185b0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
185c0 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
185d0 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
185e0 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
185f0 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
18600 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
18610 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
18620 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
18630 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
18640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18650 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18660 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
18670 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
18680 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
18690 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
186a0 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
186b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
186c0 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
186d0 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
186e0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
186f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18700 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18710 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
18720 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
18730 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
18740 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
18750 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
18760 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
18770 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
18780 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
18790 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
187a0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
187b0 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
187c0 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
187d0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
187e0 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
187f0 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
18800 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
18810 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
18820 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
18830 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
18840 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
18850 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
18860 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
18870 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
18880 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
18890 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
188a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
188b0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
188c0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
188d0 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
188e0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
188f0 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
18900 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
18910 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
18920 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
18930 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
18940 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
18950 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
18960 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
18970 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
18980 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
18990 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
189a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
189b0 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
189c0 74 20 66 6c 61 67 73 20 3d 20 0a 23 69 66 20 53  t flags = .#if S
189d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
189e0 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
189f0 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66       (pPager->vf
18a00 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
18a10 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f  EN_FILEPROTECTIO
18a20 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a  N_MASK)|.#endif.
18a30 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
18a40 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
18a50 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
18a60 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72  OURNAL);.      r
18a70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18a80 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
18a90 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
18aa0 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  s, 0);.      if(
18ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18ac0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18ad0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18ae0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20      }..      rc 
18af0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
18b00 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
18b10 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
18b20 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  rPtr);.      sql
18b30 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
18b40 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
18b50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18b60 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  {.        goto d
18b70 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18b80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d      }..      c =
18b90 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d   zMasterPtr[0]!=
18ba0 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
18bb0 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
18bc0 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ==0;.      if( c
18bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
18be0 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
18bf0 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
18c00 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18c10 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
18c20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
18c30 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
18c40 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c    }.    zJournal
18c50 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
18c60 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
18c70 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74  );.  }. .  sqlit
18c80 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65  e3OsClose(pMaste
18c90 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
18ca0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
18cb0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
18cc0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
18cd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
18ce0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
18cf0 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
18d00 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
18d10 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
18d20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
18d30 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20  pJournal) );.   
18d40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
18d50 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
18d60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18d70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18d80 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
18d90 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
18da0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
18db0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
18dc0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
18dd0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
18de0 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
18df0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
18e00 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
18e10 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
18e20 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
18e30 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
18e40 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
18e50 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
18e60 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
18e70 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61   open, or the pa
18e80 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69  ger is not in ei
18e90 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72  ther.** DBMOD or
18ea0 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69   OPEN state, thi
18eb0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
18ec0 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
18ed0 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f  , the size .** o
18ee0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68  f the file is ch
18ef0 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70  anged to nPage p
18f00 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67  ages (nPage*pPag
18f10 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
18f20 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20  es). .** If the 
18f30 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
18f40 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72  currently larger
18f50 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65   than nPage page
18f60 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20  s, then use the 
18f70 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65  VFS.** xTruncate
18f80 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75  () method to tru
18f90 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ncate it..**.** 
18fa0 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d 69 67  Or, it might mig
18fb0 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ht be the case t
18fc0 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  hat the file on 
18fd0 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20  disk is smaller 
18fe0 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70  than .** nPage p
18ff0 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61  ages. Some opera
19000 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
19010 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
19020 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
19030 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74  .** you try to t
19040 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
19050 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
19060 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
19070 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  it .** currently
19080 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74   is, so detect t
19090 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
190a0 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
190b0 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65   byte to .** the
190c0 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20   end of the new 
190d0 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  file instead..**
190e0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
190f0 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  l, return SQLITE
19100 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  _OK. If an IO er
19110 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19120 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68   modifying.** th
19130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
19140 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
19150 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
19160 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
19170 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
19180 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
19190 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
191a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
191b0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
191c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
191d0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
191e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
191f0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45  eState!=PAGER_RE
19200 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28  ADER );.  .  if(
19210 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
19220 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61 67  fd) .   && (pPag
19230 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
19240 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
19250 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
19260 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20  ==PAGER_OPEN) . 
19270 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
19280 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
19290 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
192a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
192b0 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
192c0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
192d0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
192e0 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  ;.    /* TODO: I
192f0 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73 65  s it safe to use
19300 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a   Pager.dbFileSiz
19310 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72  e here? */.    r
19320 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
19330 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
19340 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b  , &currentSize);
19350 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73  .    newSize = s
19360 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65  zPage*(i64)nPage
19370 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
19380 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65  LITE_OK && curre
19390 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20  ntSize!=newSize 
193a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75 72  ){.      if( cur
193b0 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65  rentSize>newSize
193c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
193d0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
193e0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e  te(pPager->fd, n
193f0 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  ewSize);.      }
19400 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65 6e  else if( (curren
19410 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e  tSize+szPage)<=n
19420 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
19430 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70    char *pTmp = p
19440 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
19450 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
19460 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65  (pTmp, 0, szPage
19470 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
19480 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
19490 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74  Page) == current
194a0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
194b0 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
194c0 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75  ze-szPage) >  cu
194d0 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
194e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
194f0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
19500 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67  >fd, pTmp, szPag
19510 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  e, newSize-szPag
19520 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
19550 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
19560 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
19570 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
19580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19590 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
195a0 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
195b0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
195c0 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
195d0 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
195e0 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
195f0 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
19600 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
19610 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
19620 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
19630 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
19640 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
19650 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
19660 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
19670 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
19680 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
19690 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
196a0 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
196b0 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
196c0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
196d0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
196e0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
196f0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
19700 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
19710 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
19720 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
19730 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
19740 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
19750 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
19760 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
19770 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
19780 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
19790 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
197a0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
197b0 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
197c0 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
197d0 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
197e0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
197f0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
19800 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
19810 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
19820 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
19830 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
19840 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
19850 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
19860 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
19870 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
19880 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
19890 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
198a0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
198b0 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
198c0 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
198d0 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
198e0 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
198f0 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
19900 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
19910 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
19920 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
19930 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
19940 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
19950 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
19960 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
19970 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
19980 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
19990 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
199a0 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
199b0 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
199c0 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
199d0 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
199e0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
199f0 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
19a00 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
19a10 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
19a20 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
19a30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19a40 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
19a50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19a60 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
19a70 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
19a80 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
19a90 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
19aa0 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
19ab0 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
19ac0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
19ad0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19af0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
19b00 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
19b10 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
19b20 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
19b30 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
19b40 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
19b50 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
19b60 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
19b70 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
19b80 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
19b90 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
19ba0 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
19bb0 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
19bc0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
19bd0 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
19be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
19bf0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
19c00 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
19c10 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
19c20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
19c30 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 33 32  r->sectorSize<32
19c40 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
19c50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
19c60 31 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  12;.    }.    if
19c70 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
19c80 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
19c90 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 61 73  SIZE ){.      as
19ca0 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
19cb0 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
19cc0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
19cd0 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43  orSize = MAX_SEC
19ce0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  TOR_SIZE;.    }.
19cf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
19d00 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
19d10 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
19d20 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
19d30 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
19d40 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
19d50 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
19d60 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
19d70 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
19d80 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
19d90 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
19da0 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
19db0 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
19dc0 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
19dd0 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
19de0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
19df0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
19e00 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
19e10 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
19e20 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
19e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
19e40 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
19e50 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
19e60 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
19e70 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
19e80 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
19e90 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
19ea0 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
19eb0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
19ec0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
19ed0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
19ee0 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
19ef0 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
19f00 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
19f10 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
19f20 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
19f30 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
19f40 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
19f50 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
19f60 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
19f70 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
19f80 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
19f90 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
19fa0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
19fb0 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
19fc0 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
19fd0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
19fe0 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
19ff0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a000 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a010 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  page size..**  (
1a020 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67  7)  zero padding
1a030 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74   out to the next
1a040 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a   sector size..**
1a050 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (8)  Zero or m
1a060 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
1a070 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
1a080 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
1a090 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
1a0a0 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
1a0b0 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
1a0c0 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
1a0d0 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
1a0e0 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
1a0f0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
1a100 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
1a110 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
1a120 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20  ean the first 7 
1a130 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
1a140 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
1a150 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
1a160 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1a170 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  8th item..**.** 
1a180 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
1a190 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
1a1a0 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
1a1b0 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
1a1c0 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
1a1d0 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
1a1e0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
1a1f0 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
1a200 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
1a210 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
1a220 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
1a230 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a240 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
1a250 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
1a260 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
1a270 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1a280 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
1a290 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
1a2a0 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
1a2b0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1a2c0 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
1a2d0 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
1a2e0 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
1a2f0 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
1a300 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
1a310 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
1a320 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
1a330 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1a340 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
1a350 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
1a360 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
1a370 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
1a380 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
1a390 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
1a3a0 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
1a3b0 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
1a3c0 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
1a3d0 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
1a3e0 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
1a3f0 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
1a400 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
1a410 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
1a420 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
1a430 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
1a440 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
1a450 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
1a460 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
1a470 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
1a480 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
1a490 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
1a4a0 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
1a4b0 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
1a4c0 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
1a4d0 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
1a4e0 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
1a4f0 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
1a500 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
1a510 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
1a520 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
1a530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1a540 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
1a550 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
1a560 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
1a570 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
1a580 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
1a590 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
1a5a0 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
1a5b0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
1a5c0 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
1a5d0 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
1a5e0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
1a5f0 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
1a600 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
1a610 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
1a620 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
1a630 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
1a640 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
1a650 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
1a660 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
1a670 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
1a680 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
1a690 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
1a6a0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1a6b0 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70  *.** The isHot p
1a6c0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1a6d0 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74  es that we are t
1a6e0 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  rying to rollbac
1a6f0 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74  k a journal.** t
1a700 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68  hat might be a h
1a710 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c  ot journal.  Or,
1a720 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61   it could be tha
1a730 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
1a740 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62   .** preserved b
1a750 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41  ecause of JOURNA
1a760 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72  LMODE_PERSIST or
1a770 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55   JOURNALMODE_TRU
1a780 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65  NCATE..** If the
1a790 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20   journal really 
1a7a0 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68  is hot, reset th
1a7b0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72  e pager cache pr
1a7c0 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62  ior rolling.** b
1a7d0 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e  ack any content.
1a7e0 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    If the journal
1a7f0 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69   is merely persi
1a800 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20  stent, no reset 
1a810 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f  is.** needed..*/
1a820 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a830 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
1a840 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
1a850 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Hot){.  sqlite3_
1a860 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
1a870 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20  er->pVfs;.  i64 
1a880 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
1a890 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1a8a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a8b0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
1a8c0 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
1a8d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a8e0 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
1a8f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
1a900 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
1a910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1a920 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1a930 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  er */.  Pgno mxP
1a940 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
1a950 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1a960 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e  original file in
1a970 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
1a980 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1a990 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a9a0 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74  ode of a subrout
1a9b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73  ine */.  int res
1a9c0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
1a9d0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1a9e0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73  ned by sqlite3Os
1a9f0 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68  Access() */.  ch
1aa00 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
1aa10 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1aa20 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
1aa30 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
1aa40 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52    int needPagerR
1aa50 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  eset;      /* Tr
1aa60 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65  ue to reset page
1aa70 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20   prior to first 
1aa80 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  page rollback */
1aa90 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1aaa0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1aab0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1aac0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1aad0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1aae0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1aaf0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1ab00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1ab10 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1ab20 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1ab30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1ab40 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1ab50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ab60 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ab70 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1ab80 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1ab90 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1aba0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1abb0 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1abc0 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1abd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1abe0 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1abf0 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1ac00 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1ac10 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1ac20 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1ac30 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1ac40 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1ac50 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1ac60 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1ac70 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1ac80 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1ac90 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1aca0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1acb0 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1acc0 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1acd0 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1ace0 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1acf0 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1ad00 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1ad10 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1ad20 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1ad30 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1ad40 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1ad50 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1ad60 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1ad70 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1ad80 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1ad90 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1ada0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1adb0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1adc0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1add0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1ade0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1adf0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1ae00 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1ae10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ae20 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1ae30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ae40 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1ae50 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1ae60 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1ae70 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1ae80 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1ae90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1aea0 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1aeb0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1aec0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1aed0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1aee0 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1aef0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1af00 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1af10 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1af20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1af30 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1af40 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1af50 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1af60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1af70 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1af80 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1af90 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1afa0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1afb0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1afc0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1afd0 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1afe0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1aff0 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1b000 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1b010 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1b020 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1b030 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1b040 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1b050 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1b060 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1b070 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1b080 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1b090 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1b0a0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1b0b0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1b0c0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1b0d0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1b0e0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1b0f0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1b100 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b110 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1b120 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1b130 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1b140 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1b150 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1b160 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1b170 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1b180 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1b190 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1b1a0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1b1b0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1b1c0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1b1d0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1b1e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1b1f0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1b200 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1b210 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1b220 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1b230 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1b240 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1b250 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1b260 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1b270 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1b280 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1b290 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1b2a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b2b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b2c0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1b2d0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1b2e0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1b2f0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1b300 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1b310 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1b320 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1b330 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1b340 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1b350 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1b360 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1b370 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1b380 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1b390 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1b3a0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1b3b0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1b3c0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1b3d0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1b3e0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1b3f0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1b400 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1b410 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1b420 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1b430 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b440 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1b450 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1b460 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1b470 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1b480 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1b490 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1b4a0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1b4b0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1b4c0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1b4d0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1b4e0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1b4f0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1b500 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1b510 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1b520 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1b530 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1b540 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1b550 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1b560 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1b570 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1b580 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1b590 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1b5a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1b5b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1b5c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1b5d0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1b5e0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1b5f0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1b600 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1b610 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1b620 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1b630 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1b640 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1b650 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1b660 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1b670 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1b680 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1b690 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1b6a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b6b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1b6c0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1b6d0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1b6e0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1b6f0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1b700 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1b710 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1b720 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1b730 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1b740 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1b750 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1b760 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1b770 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1b780 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1b790 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1b7a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b7b0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1b7c0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1b7d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1b7e0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1b7f0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1b800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b810 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1b820 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b830 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1b840 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1b850 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1b860 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1b870 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1b880 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1b890 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1b8a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1b8b0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1b8c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1b8d0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1b8e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1b8f0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1b900 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1b910 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1b920 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1b930 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1b940 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1b950 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1b960 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1b970 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1b980 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1b990 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b9a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
1b9b0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1b9c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
1b9d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1b9e0 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
1b9f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1ba00 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
1ba10 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1ba20 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
1ba30 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
1ba40 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72 75  nal has been tru
1ba50 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20 73  ncated, simply s
1ba60 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64 0a  top reading and.
1ba70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1ba80 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75 72  cessing the jour
1ba90 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74 20  nal. This might 
1baa0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a 6f  happen if the jo
1bab0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20 20  urnal was.      
1bac0 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c      ** not compl
1bad0 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61 6e  etely written an
1bae0 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  d synced prior t
1baf0 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20 74  o a crash.  In t
1bb00 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1bb10 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61 62   case, the datab
1bb20 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65 20  ase should have 
1bb30 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74  never been writt
1bb40 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  en in the.      
1bb50 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c 61      ** first pla
1bb60 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20 74  ce so it is OK t
1bb70 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e  o simply abandon
1bb80 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a   the rollback. *
1bb90 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
1bba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bbb0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bbc0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
1bbd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bbe0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
1bbf0 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
1bc00 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
1bc10 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
1bc20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
1bc30 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
1bc40 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
1bc50 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
1bc60 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
1bc70 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
1bc80 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
1bc90 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
1bca0 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
1bcb0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
1bcc0 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
1bcd0 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
1bce0 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
1bcf0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1bd00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1bd10 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1bd20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1bd30 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
1bd40 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
1bd50 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
1bd60 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
1bd70 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1bd80 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1bd90 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1bda0 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1bdb0 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1bdc0 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1bdd0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1bde0 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1bdf0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1be00 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1be10 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1be20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1be30 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1be40 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1be50 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1be60 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1be70 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1be80 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
1be90 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
1bea0 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ods ){.    sqlit
1beb0 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1bec0 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1bed0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1bee0 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d  NCHANGED,0);.  }
1bef0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1bf00 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69   this playback i
1bf10 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f  s happening auto
1bf20 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72  matically as a r
1bf30 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f  esult of an IO o
1bf40 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65  r .  ** malloc e
1bf50 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72  rror that occurr
1bf60 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61  ed after the cha
1bf70 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20  nge-counter was 
1bf80 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a  updated but .  *
1bf90 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  * before the tra
1bfa0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d  nsaction was com
1bfb0 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65  mitted, then the
1bfc0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1bfd0 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69  .  ** modificati
1bfe0 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65  on may just have
1bff0 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20   been reverted. 
1c000 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20  If this happens 
1c010 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20  in exclusive .  
1c020 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75  ** mode, then su
1c030 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63  bsequent transac
1c040 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20  tions performed 
1c050 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  by the connectio
1c060 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20  n will not.  ** 
1c070 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
1c080 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c  e-counter at all
1c090 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20  . This may lead 
1c0a0 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69  to cache inconsi
1c0b0 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62  stency.  ** prob
1c0c0 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70  lems for other p
1c0d0 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65  rocesses at some
1c0e0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
1c0f0 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20  ture. So, just. 
1c100 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73   ** in case this
1c110 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63   has happened, c
1c120 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43  lear the changeC
1c130 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f  ountDone flag no
1c140 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  w..  */.  pPager
1c150 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1c160 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
1c170 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d  File;..  if( rc=
1c180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c190 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1c1a0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1c1b0 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
1c1c0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1c1d0 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
1c1e0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1c1f0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
1c200 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1c210 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1c220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c230 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67 65  _OK.   && (pPage
1c240 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
1c250 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
1c260 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1c270 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29  =PAGER_OPEN).  )
1c280 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1c290 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61 67  e3PagerSync(pPag
1c2a0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1c2b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c2c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1c2d0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
1c2e0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30  Pager, zMaster[0
1c2f0 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65  ]!='\0');.    te
1c300 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c310 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c330 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1c340 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1c350 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1c360 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1c370 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1c380 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1c390 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1c3a0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1c3b0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1c3c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1c3d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1c3e0 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1c3f0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1c400 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1c410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1c420 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
1c430 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1c440 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
1c450 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
1c460 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
1c470 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
1c480 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
1c490 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
1c4a0 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
1c4b0 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
1c4c0 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
1c4d0 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
1c4e0 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
1c4f0 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
1c500 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
1c510 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1c520 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
1c530 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
1c540 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
1c550 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
1c560 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
1c570 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
1c580 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
1c590 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
1c5a0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1c5b0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1c5c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1c5d0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
1c5e0 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
1c5f0 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
1c600 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1c610 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
1c620 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
1c630 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c640 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
1c650 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
1c660 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1c670 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
1c680 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
1c690 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1c6a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c6b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c6c0 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
1c6d0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1c6e0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1c6f0 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1c700 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1c710 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1c720 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1c730 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1c740 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1c750 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1c760 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c770 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1c780 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1c790 6e 74 20 69 73 49 6e 57 61 6c 20 3d 20 30 3b 20  nt isInWal = 0; 
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c7b0 72 75 65 20 69 66 20 70 61 67 65 20 69 73 20 69  rue if page is i
1c7c0 6e 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20  n log file */.  
1c7d0 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65  int pgsz = pPage
1c7e0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20  r->pageSize; /* 
1c7f0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1c800 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  to read */..  as
1c810 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1c820 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
1c830 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ER && !MEMDB );.
1c840 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1c850 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
1c860 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21 69 73  .  if( NEVER(!is
1c870 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1c880 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
1c890 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c8a0 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e );.    memset(
1c8b0 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
1c8c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c8d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c8e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
1c8f0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
1c900 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
1c910 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65   Try to pull the
1c920 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77   page from the w
1c930 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20  rite-ahead log. 
1c940 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1c950 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67 65  te3WalRead(pPage
1c960 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
1c970 69 73 49 6e 57 61 6c 2c 20 70 67 73 7a 2c 20 70  isInWal, pgsz, p
1c980 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a  Pg->pData);.  }.
1c990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c9a0 5f 4f 4b 20 26 26 20 21 69 73 49 6e 57 61 6c 20  _OK && !isInWal 
1c9b0 29 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73  ){.    i64 iOffs
1c9c0 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1c9d0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1c9e0 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
1c9f0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1ca00 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61  er->fd, pPg->pDa
1ca10 74 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65  ta, pgsz, iOffse
1ca20 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
1ca30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1ca40 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1ca50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ca60 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1ca70 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
1ca80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1ca90 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20   /* If the read 
1caa0 69 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  is unsuccessful,
1cab0 20 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56   set the dbFileV
1cac0 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69  ers[] to somethi
1cad0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ng.      ** that
1cae0 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
1caf0 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73   valid file vers
1cb00 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73  ion.  dbFileVers
1cb10 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20  [] is a copy.   
1cb20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32     ** of bytes 2
1cb30 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1cb40 61 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38  abase.  Bytes 28
1cb50 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61  ..31 should alwa
1cb60 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a  ys be.      ** z
1cb70 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20  ero or the size 
1cb80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1cb90 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33  in page. Bytes 3
1cba0 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39  2..35 and 35..39
1cbb0 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  .      ** should
1cbc0 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73   be page numbers
1cbd0 20 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72   which are never
1cbe0 20 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f   0xffffffff.  So
1cbf0 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a   filling.      *
1cc00 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  * pPager->dbFile
1cc10 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20  Vers[] with all 
1cc20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c  0xff bytes shoul
1cc30 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20  d suffice..     
1cc40 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72   **.      ** For
1cc50 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
1cc60 74 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75  tabase, the situ
1cc70 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f  ation is more co
1cc80 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20  mplex:  bytes.  
1cc90 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66      ** 24..39 of
1cca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72   the database ar
1ccb0 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20  e white noise.  
1ccc0 42 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c  But the probabil
1ccd0 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ity of.      ** 
1cce0 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20 65 71  white noising eq
1ccf0 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1cd00 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1cd10 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1cd20 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1cd30 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1cd40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1cd50 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1cd60 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1cd70 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1cd80 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1cd90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1cda0 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1cdb0 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1cdc0 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1cdd0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1cde0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1cdf0 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1ce00 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1ce10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1ce20 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1ce30 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  ->pData, pgno, 3
1ce40 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  , rc = SQLITE_NO
1ce50 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49  MEM);..  PAGER_I
1ce60 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
1ce70 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
1ce80 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
1ce90 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
1cea0 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
1ceb0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1cec0 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52   pgno));.  PAGER
1ced0 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64  TRACE(("FETCH %d
1cee0 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1cef0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1cf00 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1cf10 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1cf20 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1cf30 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1cf40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1cf50 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1cf60 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1cf70 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1cf80 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1cf90 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1cfa0 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1cfb0 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1cfc0 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1cfd0 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1cfe0 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1cff0 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1d000 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1d010 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1d020 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1d030 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1d040 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1d050 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1d060 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1d070 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1d080 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1d090 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1d0a0 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1d0b0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1d0c0 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1d0d0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1d0e0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1d0f0 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1d100 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1d110 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1d120 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1d130 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1d140 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1d150 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1d160 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1d170 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1d180 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1d190 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1d1a0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1d1b0 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1d1c0 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1d1d0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1d1e0 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1d1f0 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1d200 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1d210 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1d220 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1d230 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1d240 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1d250 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1d260 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1d270 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1d280 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1d290 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1d2a0 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1d2b0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1d2c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d2d0 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1d2e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d2f0 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1d300 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1d310 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1d320 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1d330 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1d340 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1d350 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1d360 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1d370 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1d380 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1d390 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1d3a0 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1d3b0 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1d3c0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1d3d0 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1d3e0 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1d3f0 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1d400 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1d410 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1d420 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1d430 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1d440 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1d450 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1d460 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1d470 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1d480 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1d490 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1d4a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1d4b0 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1d4c0 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1d4d0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1d4e0 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1d4f0 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1d500 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1d510 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1d520 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1d530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d540 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1d550 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1d560 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1d570 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d580 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d590 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1d5a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1d5b0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
1d5c0 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
1d5d0 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70 50  , iPg);.  if( pP
1d5e0 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  g ){.    if( sql
1d5f0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
1d600 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20 29  fcount(pPg)==1 )
1d610 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1d620 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
1d630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d640 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1d650 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
1d660 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d670 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1d680 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
1d690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d6a0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d6b0 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  f(pPg);.    }.  
1d6c0 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  }..  /* Normally
1d6d0 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  , if a transacti
1d6e0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1d6f0 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72  k, any backup pr
1d700 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a  ocesses are.  **
1d710 20 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61   updated as data
1d720 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f   is copied out o
1d730 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1d740 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20  ournal and into 
1d750 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
1d760 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67  e. This is not g
1d770 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c  enerally possibl
1d780 65 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74  e with a WAL dat
1d790 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72  abase, as.  ** r
1d7a0 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73  ollback involves
1d7b0 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69   simply truncati
1d7c0 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  ng the log file.
1d7d0 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f   Therefore, if o
1d7e0 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20  ne.  ** or more 
1d7f0 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65  frames have alre
1d800 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1d810 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64   to the log (and
1d820 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a   therefore .  **
1d830 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74   also copied int
1d840 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74  o the backup dat
1d850 61 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20  abases) as part 
1d860 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1d870 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61  ion,.  ** the ba
1d880 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65  ckups must be re
1d890 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  started..  */.  
1d8a0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
1d8b0 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
1d8c0 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ckup);..  return
1d8d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1d8e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1d8f0 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
1d900 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
1d910 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  on a WAL databas
1d920 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1d930 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
1d940 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d950 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1d960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d970 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
1d980 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  de */.  PgHdr *p
1d990 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1d9a0 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
1d9b0 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74  of dirty pages t
1d9c0 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f  o revert */..  /
1d9d0 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  * For all pages 
1d9e0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
1d9f0 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
1da00 64 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c  dirty or have al
1da10 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20  ready.  ** been 
1da20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74  written (but not
1da30 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74   committed) to t
1da40 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20  he log file, do 
1da50 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a  one of the .  **
1da60 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a   following:.  **
1da70 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72  .  **   + Discar
1da80 64 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67  d the cached pag
1da90 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d  e (if refcount==
1daa0 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20  0), or.  **   + 
1dab0 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  Reload page cont
1dac0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1dad0 61 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75  abase (if refcou
1dae0 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50  nt>0)..  */.  pP
1daf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1db00 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1db10 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1db20 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d  3WalUndo(pPager-
1db30 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f  >pWal, pagerUndo
1db40 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
1db50 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69  *)pPager);.  pLi
1db60 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  st = sqlite3Pcac
1db70 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
1db80 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1db90 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20  while( pList && 
1dba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dbb0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78  .    PgHdr *pNex
1dbc0 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1dbd0 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  y;.    rc = page
1dbe0 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76  rUndoCallback((v
1dbf0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c  oid *)pPager, pL
1dc00 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
1dc10 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20  pList = pNext;. 
1dc20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1dc30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1dc40 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61  unction is a wra
1dc50 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
1dc60 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20  te3WalFrames(). 
1dc70 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69  As well as loggi
1dc80 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ng.** the conten
1dc90 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f  ts of the list o
1dca0 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62  f pages headed b
1dcb0 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74  y pList (connect
1dcc0 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a  ed by pDirty),.*
1dcd0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1dce0 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74  notifies any act
1dcf0 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ive backup proce
1dd00 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61  sses that the pa
1dd10 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e  ges have.** chan
1dd20 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ged. .**.** The 
1dd30 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61  list of pages pa
1dd40 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72  ssed into this r
1dd50 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73  outine is always
1dd60 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20   sorted by page 
1dd70 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65  number..** Hence
1dd80 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65  , if page 1 appe
1dd90 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20  ars anywhere on 
1dda0 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c  the list, it wil
1ddb0 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70  l be the first p
1ddc0 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  age..*/ .static 
1ddd0 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d  int pagerWalFram
1dde0 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  es(.  Pager *pPa
1ddf0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
1de00 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1de10 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72  bject */.  PgHdr
1de20 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
1de30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1de40 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20  st of frames to 
1de50 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  log */.  Pgno nT
1de60 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1de70 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1de80 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20  base size after 
1de90 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  this commit */. 
1dea0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1ded0 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a   is a commit */.
1dee0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df00 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1df10 6f 64 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ode */.#if defin
1df20 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1df30 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1df40 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 29 0a  TE_CHECK_PAGES).
1df50 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1df80 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 23   over pages */.#
1df90 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
1dfa0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1dfb0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1dfc0 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1dfd0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1dfe0 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1dff0 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1e000 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1e010 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e020 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1e030 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1e040 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1e050 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1e060 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1e070 0a 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74  ..  if( isCommit
1e080 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
1e090 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1e0a0 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74  is being committ
1e0b0 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ed, there is no 
1e0c0 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67  point in writing
1e0d0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65  .    ** any page
1e0e0 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
1e0f0 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
1e100 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20   nTruncate into 
1e110 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20  the WAL file..  
1e120 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e    ** They will n
1e130 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79 20  ever be read by 
1e140 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72  any client. So r
1e150 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
1e160 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a  the pDirty.    *
1e170 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a  * list here. */.
1e180 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
1e190 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1e1a0 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 66   = &pList;.    f
1e1b0 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70  or(p=pList; (*pp
1e1c0 4e 65 78 74 20 3d 20 70 29 3b 20 70 3d 70 2d 3e  Next = p); p=p->
1e1d0 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69  pDirty){.      i
1e1e0 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75  f( p->pgno<=nTru
1e1f0 6e 63 61 74 65 20 29 20 70 70 4e 65 78 74 20 3d  ncate ) ppNext =
1e200 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1e210 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1e220 4c 69 73 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  List );.  }..  i
1e230 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
1e240 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
1e250 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
1e260 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ist);.  rc = sql
1e270 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
1e280 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
1e290 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
1e2a0 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
1e2b0 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
1e2c0 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
1e2d0 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28  Flags.  );.  if(
1e2e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1e2f0 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  & pPager->pBacku
1e300 70 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  p ){.    PgHdr *
1e310 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69  p;.    for(p=pLi
1e320 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72  st; p; p=p->pDir
1e330 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ty){.      sqlit
1e340 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
1e350 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
1e360 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70  p->pgno, (u8 *)p
1e370 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->pData);.    }.
1e380 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1e390 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1e3a0 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
1e3b0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1e3c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1e3d0 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  ;.  for(p=pList;
1e3e0 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1e3f0 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f  {.    pager_set_
1e400 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d  pagehash(p);.  }
1e410 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1e420 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
1e430 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e  egin a read tran
1e440 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57  saction on the W
1e450 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  AL..**.** This r
1e460 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62  outine used to b
1e470 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f  e called "pagerO
1e480 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62  penSnapshot()" b
1e490 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74  ecause it essent
1e4a0 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61  ially.** makes a
1e4b0 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65   snapshot of the
1e4c0 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
1e4d0 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69   current point i
1e4e0 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65  n time and prese
1e4f0 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61  rves.** that sna
1e500 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79  pshot for use by
1e510 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73   the reader in s
1e520 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65  pite of concurre
1e530 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a  ntly changes by.
1e540 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73  ** other writers
1e550 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72   or checkpointer
1e560 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1e570 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
1e580 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
1e590 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1e5a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e5c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1e5d0 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30   int changed = 0
1e5e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e5f0 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
1e600 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20  e must be reset 
1e610 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  */..  assert( pa
1e620 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e630 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e640 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1e650 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61  AGER_OPEN || pPa
1e660 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1e670 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20  ER_READER );..  
1e680 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64  /* sqlite3WalEnd
1e690 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
1e6a0 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
1e6b0 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
1e6c0 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  s.  ** transacti
1e6d0 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  on in locking_mo
1e6e0 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53  de=EXCLUSIVE.  S
1e6f0 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20  o call it now.  
1e700 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69  If we.  ** are i
1e710 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e  n locking_mode=N
1e720 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61  ORMAL and EndRea
1e730 64 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73  d() was previous
1e740 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20  ly called,.  ** 
1e750 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61  the duplicate ca
1e760 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a  ll is harmless..
1e770 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61    */.  sqlite3Wa
1e780 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
1e790 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
1e7a0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1e7b0 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72  e3WalBeginReadTr
1e7c0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1e7d0 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64  ->pWal, &changed
1e7e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1e7f0 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65  ITE_OK || change
1e800 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72  d ){.    pager_r
1e810 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1e820 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1e830 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1e840 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e850 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
1e860 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
1e870 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45  n from PAGER_OPE
1e880 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45  N.** to PAGER_RE
1e890 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64 65  ADER state to de
1e8a0 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
1e8b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e8c0 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65   file.** in page
1e8d0 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
1e8e0 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e  page size curren
1e8f0 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61  tly stored in Pa
1e900 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a  ger.pageSize)..*
1e910 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72  *.** If no error
1e920 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f   occurs, SQLITE_
1e930 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1e940 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
1e950 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69  he database.** i
1e960 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72 65  n pages is store
1e970 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74  d in *pnPage. Ot
1e980 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f  herwise, an erro
1e990 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a  r code (perhaps.
1e9a0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1e9b0 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72 6e  FSTAT) is return
1e9c0 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ed and *pnPage i
1e9d0 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65  s left unmodifie
1e9e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e9f0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1ea00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1ea10 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  gno *pnPage){.  
1ea20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
1ea50 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
1ea60 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68  /..  /* Query th
1ea70 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d  e WAL sub-system
1ea80 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
1ea90 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44  e size. The WalD
1eaa0 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e  bsize().  ** fun
1eab0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65  ction returns ze
1eac0 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69 73  ro if the WAL is
1ead0 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20   not open (i.e. 
1eae0 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20  Pager.pWal==0), 
1eaf0 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64  or.  ** if the d
1eb00 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1eb10 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54  not available. T
1eb20 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1eb30 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61   is not.  ** ava
1eb40 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20  ilable from the 
1eb50 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69  WAL sub-system i
1eb60 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69  f the log file i
1eb70 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20  s empty or.  ** 
1eb80 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69  contains no vali
1eb90 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  d committed tran
1eba0 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  sactions..  */. 
1ebb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ebc0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
1ebd0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
1ebe0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
1ebf0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
1ec00 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   nPage = sqlite3
1ec10 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72  WalDbsize(pPager
1ec20 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49  ->pWal);..  /* I
1ec30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
1ec40 69 7a 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69  ize was not avai
1ec50 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57  lable from the W
1ec60 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20  AL sub-system,. 
1ec70 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74   ** determine it
1ec80 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69   based on the si
1ec90 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1eca0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
1ecb0 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  size.  ** of the
1ecc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ecd0 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
1ece0 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1ecf0 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a   page-size,.  **
1ed00 20 72 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74   round down to t
1ed10 68 65 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e  he nearest page.
1ed20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
1ed30 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a  e larger than 0.
1ed40 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
1ed50 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ze is considered
1ed60 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c   to contain at l
1ed70 65 61 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20  east one page.. 
1ed80 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d   */.  if( nPage=
1ed90 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20  =0 ){.    i64 n 
1eda0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1edb0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1edc0 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79  of db file in by
1edd0 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  tes */.    asser
1ede0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1edf0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1ee00 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
1ee10 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1ee20 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
1ee30 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
1ee40 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1ee50 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20  er->fd, &n);.   
1ee60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ee70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ee80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ee90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61   }.    }.    nPa
1eea0 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70  ge = (Pgno)((n+p
1eeb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
1eec0 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  1) / pPager->pag
1eed0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
1eee0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
1eef0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ef00 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
1ef10 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1ef20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
1ef30 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
1ef40 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
1ef50 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
1ef60 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
1ef70 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
1ef80 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
1ef90 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
1efa0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
1efb0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
1efc0 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
1efd0 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
1efe0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1eff0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1f000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1f010 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
1f020 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
1f030 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
1f040 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1f050 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
1f060 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
1f070 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
1f080 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
1f090 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
1f0a0 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
1f0b0 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
1f0c0 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
1f0d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1f0e0 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
1f0f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f100 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
1f110 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
1f120 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
1f130 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
1f140 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
1f150 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
1f160 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
1f170 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
1f180 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
1f190 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
1f1a0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
1f1b0 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
1f1c0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
1f1d0 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
1f1e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1f1f0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1f200 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1f210 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
1f220 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
1f230 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f240 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
1f250 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
1f260 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
1f270 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
1f280 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
1f290 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
1f2a0 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
1f2b0 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
1f2c0 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
1f2d0 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
1f2e0 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
1f2f0 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
1f300 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
1f310 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
1f320 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
1f330 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1f340 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1f350 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
1f360 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
1f370 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1f380 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1f390 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f3a0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f3b0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1f3c0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1f3d0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
1f3e0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
1f3f0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
1f400 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
1f410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1f420 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
1f430 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e  xists */.    Pgn
1f440 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
1f450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1f460 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1f470 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
1f480 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  rc = pagerPageco
1f490 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61  unt(pPager, &nPa
1f4a0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1f4b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f4c0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b   if( nPage==0 ){
1f4d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f4e0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
1f4f0 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
1f500 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ->zWal, 0);.    
1f510 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20 20 20    isWal = 0;.   
1f520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1f530 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1f540 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  ss(.          pP
1f550 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
1f560 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
1f570 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1f580 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29 3b 0a  &isWal.      );.
1f590 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1f5a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f5b0 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
1f5c0 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
1f5d0 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
1f5e0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
1f5f0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
1f600 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1f610 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
1f620 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  al(pPager, 0);. 
1f630 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1f640 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1f650 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1f660 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20  LMODE_WAL ){.   
1f670 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1f680 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
1f690 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
1f6a0 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
1f6b0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f6c0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
1f6d0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76  .** Playback sav
1f6e0 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e  epoint pSavepoin
1f6f0 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  t. Or, if pSavep
1f700 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
1f710 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
1f720 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
1f730 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1f740 20 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74   case pSavepoint
1f750 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68  ==NULL occurs wh
1f760 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43  en .** a ROLLBAC
1f770 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20  K TO command is 
1f780 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56  invoked on a SAV
1f790 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61  EPOINT that is a
1f7a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1f7b0 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a   savepoint..**.*
1f7c0 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e  * When pSavepoin
1f7d0 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d  t is not NULL (m
1f7e0 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61  eaning a non-tra
1f7f0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
1f800 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20  nt is .** being 
1f810 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68  rolled back), th
1f820 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
1f830 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74  consists of up t
1f840 6f 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a  o three stages,.
1f850 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20  ** performed in 
1f860 74 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66  the order specif
1f870 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ied:.**.**   * P
1f880 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20  ages are played 
1f890 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
1f8a0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
1f8b0 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20  ing at byte.**  
1f8c0 20 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53     offset PagerS
1f8d0 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
1f8e0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
1f8f0 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  to .**     Pager
1f900 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1f910 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20  fset, or to the 
1f920 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
1f930 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
1f940 69 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65  ile if PagerSave
1f950 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f960 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20   is zero..**.** 
1f970 20 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65    * If PagerSave
1f980 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
1f990 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
1f9a0 65 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61  en pages are pla
1f9b0 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20  yed.**     back 
1f9c0 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68  starting from th
1f9d0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1f9e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1f9f0 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50  lowing .**     P
1fa00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1fa10 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  drOffset to the 
1fa20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  end of the main 
1fa30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
1fa40 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
1fa50 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61  e then played ba
1fa60 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ck from the sub-
1fa70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74  journal file, st
1fa80 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69  arting.**     wi
1fa90 74 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65  th the PagerSave
1faa0 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e  point.iSubRec an
1fab0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
1fac0 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20  the end of.**   
1fad0 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    the journal fi
1fae0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67  le..**.** Throug
1faf0 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  hout the rollbac
1fb00 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20  k process, each 
1fb10 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72  time a page is r
1fb20 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a  olled back, the.
1fb30 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
1fb40 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61   bit is set in a
1fb50 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
1fb60 65 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e  e (variable pDon
1fb70 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c  e in the.** impl
1fb80 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77  ementation below
1fb90 29 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  ). This is used 
1fba0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  to ensure that a
1fbb0 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a   page is only.**
1fbc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
1fbd0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69   first time it i
1fbe0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e  s encountered in
1fbf0 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e   either journal.
1fc00 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70  .**.** If pSavep
1fc10 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  oint is NULL, th
1fc20 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c  en pages are onl
1fc30 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  y played back fr
1fc40 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  om the main.** j
1fc50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1fc60 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
1fc70 72 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68  r a bitvec in th
1fc80 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
1fc90 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62  n either case, b
1fca0 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63  efore playback c
1fcb0 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67  ommences the Pag
1fcc0 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62  er.dbSize variab
1fcd0 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74  le.** is reset t
1fce0 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
1fcf0 20 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20   it held at the 
1fd00 73 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76  start of the sav
1fd10 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74  epoint .** (or t
1fd20 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20  ransaction). No 
1fd30 70 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65  page with a page
1fd40 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20  -number greater 
1fd50 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a  than this value.
1fd60 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63  ** is played bac
1fd70 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63  k. If one is enc
1fd80 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73  ountered it is s
1fd90 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a  imply skipped..*
1fda0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1fdb0 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
1fdc0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
1fdd0 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  r, PagerSavepoin
1fde0 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a  t *pSavepoint){.
1fdf0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
1fe00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66             /* Ef
1fe10 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20  fective size of 
1fe20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1fe30 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
1fe40 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
1fe50 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73  * End of first s
1fe60 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a  egment of main-j
1fe70 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a  ournal records *
1fe80 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1fe90 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
1fea0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1feb0 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d   Bitvec *pDone =
1fec0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74   0;       /* Bit
1fed0 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61  vec to ensure pa
1fee0 67 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ges played back 
1fef0 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20  only once */..  
1ff00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ff10 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
1ff20 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
1ff30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
1ff40 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
1ff50 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  CKED );..  /* Al
1ff60 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
1ff70 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
1ff80 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
1ff90 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
1ffa0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
1ffb0 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
1ffc0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
1ffd0 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
1ffe0 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
1fff0 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
20000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20010 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
20020 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
20030 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
20040 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
20050 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
20060 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
20070 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
20080 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
20090 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
200a0 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
200b0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
200c0 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
200d0 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
200e0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
200f0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
20100 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
20110 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
20120 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20130 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
20140 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
20150 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
20160 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
20170 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
20180 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
20190 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
201a0 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
201b0 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
201c0 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
201d0 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
201e0 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
201f0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
20200 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
20210 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
20220 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
20230 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
20240 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
20250 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
20260 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
20270 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
20280 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
20290 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
202a0 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
202b0 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
202c0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
202d0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
202e0 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
202f0 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
20300 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
20310 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
20320 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
20330 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
20340 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
20350 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
20360 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
20370 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
20380 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
20390 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
203a0 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
203b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
203c0 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
203d0 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
203e0 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
203f0 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
20400 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
20410 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
20420 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
20430 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
20440 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20450 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
20460 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
20470 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
20480 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
20490 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
204a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
204b0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
204c0 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
204d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
204e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
204f0 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
20500 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20510 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
20520 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
20530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20540 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
20550 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
20570 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
20580 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20590 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
205a0 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
205b0 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
205c0 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
205d0 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
205e0 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
205f0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
20600 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
20610 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
20620 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
20630 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
20640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
20650 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
20660 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
20670 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
20680 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
20690 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
206a0 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
206b0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
206c0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
206d0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
206e0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
206f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
20700 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
20710 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
20720 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20730 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
20740 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
20750 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
20760 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
20770 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
20780 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
20790 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
207a0 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
207b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
207c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
207d0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
207e0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
207f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
20800 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
20810 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
20820 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
20830 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
20840 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
20850 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
20860 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
20870 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
20880 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
20890 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
208a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
208b0 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
208c0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
208d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
208e0 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
208f0 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
20900 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20910 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
20920 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
20930 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
20940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
20950 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
20960 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
20970 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
20980 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20990 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
209a0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
209b0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
209c0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
209d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
209e0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
209f0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
20a00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
20a10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
20a20 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
20a30 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
20a40 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
20a50 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
20a60 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
20a70 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
20a80 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
20a90 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20aa0 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
20ab0 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
20ac0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
20ad0 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
20ae0 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
20af0 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
20b00 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
20b10 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
20b20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
20b30 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
20b40 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
20b50 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
20b60 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
20b70 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
20b80 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20b90 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
20ba0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
20bb0 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
20bc0 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
20bd0 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
20be0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
20bf0 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
20c00 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
20c10 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
20c20 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
20c30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20c40 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
20c50 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
20c60 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
20c70 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20c80 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20c90 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
20ca0 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
20cb0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
20cc0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
20cd0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
20ce0 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
20cf0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
20d10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20d20 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
20d30 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20d40 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
20d50 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
20d60 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
20d70 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
20d80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20d90 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
20da0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
20db0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
20dc0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
20dd0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
20de0 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
20df0 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ge);.}../*.** Fr
20e00 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
20e10 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
20e20 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
20e30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
20e40 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
20e50 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
20e60 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
20e70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
20e80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
20e90 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
20ea0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20eb0 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
20ec0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
20ed0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
20ee0 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
20ef0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
20f00 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
20f10 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
20f20 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
20f30 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
20f40 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
20f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
20f60 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
20f70 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
20f80 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
20f90 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
20fa0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
20fb0 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
20fc0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
20fd0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
20fe0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
20ff0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
21000 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
21010 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
21020 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
21030 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
21040 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
21060 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
21070 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
21080 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
21090 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
210a0 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
210b0 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
210c0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
210d0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
210e0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
210f0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
21100 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
21110 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
21130 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
21140 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
21150 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
21160 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
21170 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
21180 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
21190 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
211a0 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
211b0 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
211c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
211d0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
211e0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
211f0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
21200 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
21210 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
21220 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
21230 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
21240 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
21250 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
21260 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
21270 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
21280 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
21290 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
212a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
212b0 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
212c0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
212d0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
212e0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
212f0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
21300 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
21310 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21320 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
21330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65  .**.** The above
21340 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61   is for a rollba
21350 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e  ck-journal mode.
21360 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20    For WAL mode, 
21370 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a  OFF continues.**
21380 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f   to mean that no
21390 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75   syncs ever occu
213a0 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73  r.  NORMAL means
213b0 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73   that the WAL is
213c0 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72   synced.** prior
213d0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
213e0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20   checkpoint and 
213f0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
21400 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  e file is synced
21410 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
21420 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65  usion of the che
21430 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65  ckpoint if the e
21440 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
21450 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20   the WAL.** was 
21460 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
21470 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
21480 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65   But no sync ope
21490 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f  rations occur fo
214a0 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79  r.** an ordinary
214b0 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41   commit in NORMA
214c0 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e  L mode with WAL.
214d0 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61    FULL means tha
214e0 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c  t the WAL.** fil
214f0 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c  e is synced foll
21500 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69  owing each commi
21510 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20  t operation, in 
21520 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a  addition to the.
21530 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61  ** syncs associa
21540 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e  ted with NORMAL.
21550 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f  .**.** Do not co
21560 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75  nfuse synchronou
21570 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49  s=FULL with SQLI
21580 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54  TE_SYNC_FULL.  T
21590 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e  he.** SQLITE_SYN
215a0 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61  C_FULL macro mea
215b0 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61  ns to use the Ma
215c0 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d  cOSX-style full-
215d0 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66  fsync.** using f
215e0 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43  cntl(F_FULLFSYNC
215f0 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ).  SQLITE_SYNC_
21600 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20  NORMAL means to 
21610 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72  do an.** ordinar
21620 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20  y fsync() call. 
21630 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
21640 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
21650 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
21660 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53  .** and SQLITE_S
21670 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c  YNC_NORMAL on pl
21680 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68  atforms other th
21690 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20  an MacOSX.  But 
216a0 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f  the.** synchrono
216b0 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73  us=FULL versus s
216c0 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
216d0 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d  L setting determ
216e0 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ines when.** the
216f0 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65   xSync primitive
21700 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69   is called and i
21710 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c  s relevant to al
21720 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a  l platforms..**.
21730 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
21740 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
21750 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
21760 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
21770 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
21780 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
21790 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
217a0 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
217b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
217c0 65 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65  etyLevel(.  Page
217d0 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
217e0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
217f0 6f 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76  o set safety lev
21800 65 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  el for */.  int 
21810 6c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20  level,          
21820 20 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63    /* PRAGMA sync
21830 68 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c  hronous.  1=OFF,
21840 20 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c   2=NORMAL, 3=FUL
21850 4c 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75  L */  .  int bFu
21860 6c 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f  llFsync,       /
21870 2a 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79  * PRAGMA fullfsy
21880 6e 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70  nc */.  int bCkp
21890 74 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a  tFullFsync    /*
218a0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
218b0 6e 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a  nt_fullfsync */.
218c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  ){.  assert( lev
218d0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
218e0 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
218f0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
21900 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
21910 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
21920 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
21930 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
21940 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
21950 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
21960 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
21970 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
21980 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
21990 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
219a0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
219b0 73 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e  se if( bFullFsyn
219c0 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
219d0 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
219e0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
219f0 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
21a00 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
21a10 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
21a20 65 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75  else if( bCkptFu
21a30 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
21a40 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
21a50 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
21a60 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
21a70 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
21a80 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
21a90 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
21aa0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
21ab0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21ac0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
21ad0 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
21ae0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
21af0 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
21b00 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
21b10 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
21b20 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
21b30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
21b40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
21b50 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20  walSyncFlags |= 
21b60 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43  WAL_SYNC_TRANSAC
21b70 54 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  TIONS;.  }.}.#en
21b80 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
21b90 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
21ba0 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72  variable is incr
21bb0 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72  emented whenever
21bc0 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20   the library.** 
21bd0 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e  attempts to open
21be0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
21bf0 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  e.  This informa
21c00 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
21c10 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20  .** testing and 
21c20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20  analysis only.  
21c30 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
21c40 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
21c50 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
21c60 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
21c70 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
21c80 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  orary file..**.*
21c90 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
21ca0 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
21cb0 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20   *pFile. Return 
21cc0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
21cd0 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65  cess .** or some
21ce0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
21cf0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
21d00 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
21d10 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65  tically .** dele
21d20 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
21d30 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
21d40 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
21d50 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  he flags passed 
21d60 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  to the VFS layer
21d70 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72   xOpen() call ar
21d80 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  e those specifie
21d90 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  d.** by paramete
21da0 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20  r vfsFlags ORed 
21db0 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
21dc0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  ng:.**.**     SQ
21dd0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
21de0 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ITE.**     SQLIT
21df0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a  E_OPEN_CREATE.**
21e00 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
21e10 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20  _EXCLUSIVE.**   
21e20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
21e30 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73  LETEONCLOSE.*/.s
21e40 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f  tatic int pagerO
21e50 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72  pentemp(.  Pager
21e60 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
21e70 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62   /* The pager ob
21e80 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
21e90 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
21ea0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  /* Write the fil
21eb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72  e descriptor her
21ec0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
21ed0 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ags          /* 
21ee0 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
21ef0 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20  ough to the VFS 
21f00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21f20 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21f30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
21f40 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
21f50 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
21f60 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
21f70 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
21f80 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
21f90 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
21fa0 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41   .#if SQLITE_ENA
21fb0 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
21fc0 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
21fd0 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
21fe0 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
21ff0 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
22000 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
22010 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
22020 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
22030 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
22040 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
22050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
22060 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
22070 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
22080 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
22090 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
220a0 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
220b0 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
220c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
220d0 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
220e0 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
220f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22100 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
22110 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
22120 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
22130 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
22140 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
22150 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
22160 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
22170 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
22180 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
22190 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
221a0 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
221b0 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
221c0 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
221d0 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
221e0 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
221f0 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
22200 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
22210 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
22220 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
22230 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
22240 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
22250 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
22260 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
22270 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
22280 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
22290 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
222a0 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
222b0 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222d0 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
222e0 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
222f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22320 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
22330 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
22340 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
22350 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
22360 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
22370 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
22380 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
22390 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
223a0 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
223b0 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
223c0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
223d0 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
223e0 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
223f0 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
22400 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
22410 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
22420 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
22430 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
22440 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
22450 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
22460 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
22470 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
22480 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
22490 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
224a0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
224b0 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
224c0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
224d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
224e0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
224f0 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
22500 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
22510 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
22520 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
22530 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
22540 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
22550 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
22560 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
22570 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
22580 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20  ndler */.){  .  
22590 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
225a0 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
225b0 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
225c0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
225d0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
225e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
225f0 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
22600 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
22610 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
22620 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
22630 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
22640 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
22650 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
22660 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
22670 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
22680 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
22690 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
226a0 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
226b0 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
226c0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
226d0 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
226e0 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
226f0 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
22700 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f  R_xxx sub-code o
22710 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
22720 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
22730 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
22740 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
22750 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
22760 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
22770 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
22780 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
22790 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
227a0 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
227b0 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
227c0 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
227d0 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
227e0 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
227f0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
22800 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
22810 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
22820 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
22830 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
22840 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
22850 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
22860 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
22870 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
22880 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
22890 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
228a0 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
228b0 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
228c0 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
228d0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
228e0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
228f0 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
22900 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
22910 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
22920 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
22930 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
22940 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
22950 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
22960 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
22970 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
22980 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
22990 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
229a0 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
229b0 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
229c0 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
229d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
229e0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
229f0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
22a00 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
22a10 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
22a20 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
22a30 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
22a40 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
22a50 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
22a60 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
22a70 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
22a80 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
22a90 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
22aa0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
22ab0 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
22ac0 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
22ad0 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
22ae0 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
22af0 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
22b00 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
22b10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
22b20 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
22b30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33  ager *pPager, u3
22b40 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  2 *pPageSize, in
22b50 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
22b60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22b70 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  K;..  /* It is n
22b80 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
22b90 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f  o a full assert_
22ba0 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65  pager_state() he
22bb0 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a  re, as this.  **
22bc0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
22bd0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
22be0 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c  hin PagerOpen(),
22bf0 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
22c00 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61  e.  ** of the Pa
22c10 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  ger object is in
22c20 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
22c30 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ent..  **.  ** A
22c40 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
22c50 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
22c60 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
22c70 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
22c80 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f  .  ** PAGER_ERRO
22c90 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e  R state. But sin
22ca0 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ce PAGER_ERROR s
22cb0 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20  tate guarantees 
22cc0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20  that.  ** there 
22cd0 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  is at least one 
22ce0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
22cf0 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73   reference, this
22d00 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
22d10 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
22d20 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a  at case anyhow..
22d30 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65    */..  u32 page
22d40 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
22d50 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
22d60 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
22d70 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
22d80 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
22d90 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
22da0 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
22db0 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
22dc0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
22dd0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
22de0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
22df0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
22e00 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
22e10 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32  & pageSize!=(u32
22e20 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
22e30 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
22e40 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20   *pNew = NULL;  
22e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
22e60 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
22e70 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20      i64 nByte = 
22e80 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  0;..    if( pPag
22e90 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
22ea0 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28  _OPEN && isOpen(
22eb0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
22ec0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22ed0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
22ee0 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
22ef0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
22f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22f10 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
22f20 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
22f30 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
22f40 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
22f50 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  w ) rc = SQLITE_
22f60 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
22f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
22f90 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
22fa0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
22fb0 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28  dbSize = (Pgno)(
22fc0 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d  (nByte+pageSize-
22fd0 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  1)/pageSize);.  
22fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
22ff0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
23000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
23010 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
23020 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
23030 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
23040 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
23050 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
23060 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
23070 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
23080 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ize);.    }.  }.
23090 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
230a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
230b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
230c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
230d0 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52   nReserve<0 ) nR
230e0 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d  eserve = pPager-
230f0 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61  >nReserve;.    a
23100 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
23110 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31  =0 && nReserve<1
23120 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  000 );.    pPage
23130 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69  r->nReserve = (i
23140 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  16)nReserve;.   
23150 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
23160 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
23170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23180 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
23190 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
231a0 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
231b0 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
231c0 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
231d0 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
231e0 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
231f0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
23200 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
23210 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
23220 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
23230 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
23240 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
23250 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
23260 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
23270 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
23280 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
23290 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
232a0 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
232b0 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
232c0 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
232d0 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
232e0 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
232f0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
23300 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
23310 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
23320 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
23330 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
23340 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
23350 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
23360 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
23370 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
23380 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
23390 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
233a0 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
233b0 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
233c0 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
233d0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
233e0 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
233f0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
23400 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
23410 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
23420 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
23430 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
23440 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
23450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23460 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
23470 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
23480 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
23490 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
234a0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
234b0 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
234c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
234d0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50  eState!=PAGER_OP
234e0 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43 61  EN );      /* Ca
234f0 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50 5f  lled only by OP_
23500 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61 73  MaxPgcnt */.  as
23510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 78  sert( pPager->mx
23520 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno>=pPager->db
23530 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f 4d  Size );  /* OP_M
23540 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65 73  axPgcnt enforces
23550 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75 72   this */.  retur
23560 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n pPager->mxPgno
23570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
23580 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
23590 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
235a0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
235b0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
235c0 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
235d0 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
235e0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
235f0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
23600 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
23610 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
23620 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
23630 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
23640 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
23650 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
23660 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
23670 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
23680 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
23690 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
236a0 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
236b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
236c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
236d0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
236e0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
236f0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
23700 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c  cnt;.void disabl
23710 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
23720 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
23730 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74  aved_cnt = sqlit
23740 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
23750 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ing;.  sqlite3_i
23760 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
23770 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61  = -1;.}.void ena
23780 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
23790 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
237a0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
237b0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65  r_pending = save
237c0 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23  d_cnt;.}.#else.#
237d0 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f   define disable_
237e0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
237f0 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65  ors().# define e
23800 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
23810 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64  io_errors().#end
23820 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  if../*.** Read t
23830 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73  he first N bytes
23840 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e   from the beginn
23850 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ing of the file 
23860 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74  into memory.** t
23870 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73  hat pDest points
23880 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74   to. .**.** If t
23890 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65  he pager was ope
238a0 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65  ned on a transie
238b0 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61  nt file (zFilena
238c0 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f  me==""), or.** o
238d0 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20  pened on a file 
238e0 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65  less than N byte
238f0 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f  s in size, the o
23900 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a  utput buffer is.
23910 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51  ** zeroed and SQ
23920 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23930 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20  . The rationale 
23940 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
23950 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
23960 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  on is used to re
23970 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64  ad database head
23980 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74  ers, and a new t
23990 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a  ransient or.** z
239a0 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61  ero sized databa
239b0 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20  se has a header 
239c0 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e  than consists en
239d0 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73  tirely of zeroes
239e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49  ..**.** If any I
239f0 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72  O error apart fr
23a00 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  om SQLITE_IOERR_
23a10 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e  SHORT_READ is en
23a20 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68  countered,.** th
23a30 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
23a40 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
23a50 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63  caller and the c
23a60 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
23a70 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  * output buffer 
23a80 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e  undefined..*/.in
23a90 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
23aa0 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
23ab0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
23ac0 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
23ad0 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
23ae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23af0 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
23b00 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
23b10 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
23b20 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
23b30 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  empFile );..  /*
23b40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
23b50 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
23b60 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65 6c  btree immediatel
23b70 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e 67  y after creating
23b80 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72 20  .  ** the Pager 
23b90 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20 68  object.  There h
23ba0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20 6f  as not been an o
23bb0 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72  pportunity to tr
23bc0 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  ansition.  ** to
23bd0 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a 20   WAL mode yet.. 
23be0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
23bf0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
23c00 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4f  r) );..  if( isO
23c10 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
23c20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
23c30 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
23c40 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
23c50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23c60 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
23c70 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
23c80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23c90 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
23ca0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
23cb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
23cc0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23cd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
23ce0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f  s function may o
23cf0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
23d00 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
23d10 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
23d20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20 49  .** the pager. I
23d30 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f  t returns the to
23d40 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
23d50 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
23d60 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76  ase..**.** Howev
23d70 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20  er, if the file 
23d80 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  is between 1 and
23d90 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74   <page-size> byt
23da0 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e  es in size, then
23db0 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e   .** this is con
23dc0 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67 65  sidered a 1 page
23dd0 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
23de0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
23df0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
23e00 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29  er, int *pnPage)
23e10 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
23e20 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
23e30 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
23e40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
23e50 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49 54  tate!=PAGER_WRIT
23e60 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a 20  ER_FINISHED );. 
23e70 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29   *pnPage = (int)
23e80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
23e90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
23ea0 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
23eb0 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
23ec0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23ed0 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
23ee0 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
23ef0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
23f00 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
23f10 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
23f20 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
23f30 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
23f40 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
23f50 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
23f60 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
23f70 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
23f80 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
23f90 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
23fa0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
23fb0 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
23fc0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
23fd0 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
23fe0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
23ff0 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
24000 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
24010 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
24020 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
24030 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
24040 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
24050 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
24060 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
24070 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
24080 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
24090 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
240a0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
240b0 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
240c0 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
240d0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
240e0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
240f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
24100 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
24110 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24120 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
24130 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
24160 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  ode */..  /* Che
24170 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20  ck that this is 
24180 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28  either a no-op (
24190 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75  because the requ
241a0 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20  ested lock is . 
241b0 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64   ** already held
241c0 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  , or one of the 
241d0 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61  transistions tha
241e0 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  t the busy-handl
241f0 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  er.  ** may be i
24200 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61  nvoked during, a
24210 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
24220 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20  comment above.  
24230 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ** sqlite3PagerS
24240 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e  etBusyhandler().
24250 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
24260 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d  (pPager->eLock>=
24270 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20  locktype).      
24280 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   || (pPager->eLo
24290 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 6c  ck==NO_LOCK && l
242a0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
242b0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK).       || 
242c0 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
242d0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
242e0 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
242f0 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a  SIVE_LOCK).  );.
24300 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20 3d  .  do {.    rc =
24310 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
24320 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  ger, locktype);.
24330 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
24340 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
24350 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
24360 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
24370 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
24380 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24390 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73 73  .** Function ass
243a0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
243b0 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63 68  raint(pPager) ch
243c0 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  ecks that one of
243d0 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
243e0 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20 61  ng is true for a
243f0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 63  ll dirty pages c
24400 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
24410 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a  page-cache:.**.*
24420 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65 20  *   a) The page 
24430 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74  number is less t
24440 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
24450 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
24460 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e 74  .**      current
24470 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c   database image,
24480 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a 2a   in pages, OR.**
24490 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65 20  .**   b) if the 
244a0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65 72  page content wer
244b0 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68 69  e written at thi
244c0 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c 64  s time, it would
244d0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65 20   not.**      be 
244e0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
244f0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  te the current c
24500 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74 68  ontent out to th
24510 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
24520 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72 6d        (as determ
24530 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f 6e  ined by function
24540 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
24550 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  e())..**.** If t
24560 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73 73  he condition ass
24570 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66 75  erted by this fu
24580 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20  nction were not 
24590 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a 2a  true, and the.**
245a0 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72 65   dirty page were
245b0 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65 64   to be discarded
245c0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
245d0 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74 72  via the pagerStr
245e0 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ess().** routine
245f0 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  , pagerStress() 
24600 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65 20  would not write 
24610 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
24620 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20 74   content to.** t
24630 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24640 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e 74  . If a savepoint
24650 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65 72   transaction wer
24660 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 66  e rolled back af
24670 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70 70  ter.** this happ
24680 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65 63  ened, the correc
24690 74 20 62 65 68 61 76 69 6f 75 72 20 77 6f 75 6c  t behaviour woul
246a0 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
246b0 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
246c0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
246d0 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
246e0 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
246f0 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
24700 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
24710 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
24720 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
24730 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
24740 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
24750 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
24760 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
24770 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
24780 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
24790 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
247a0 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
247b0 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
247c0 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
247d0 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
247e0 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
247f0 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
24800 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
24810 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
24820 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
24830 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
24840 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
24850 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
24860 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
24870 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
24880 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
24890 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
248a0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
248b0 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
248c0 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
248d0 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
248e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
248f0 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
24900 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
24910 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
24920 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
24930 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
24940 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
24950 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
24960 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
24970 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
24980 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
24990 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
249a0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
249b0 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
249c0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
249d0 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
249e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
249f0 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
24a00 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
24a10 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
24a20 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
24a30 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
24a40 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
24a50 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
24a60 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
24a70 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
24a80 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24a90 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
24aa0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
24ab0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
24ac0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24ad0 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
24ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24af0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
24b00 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
24b10 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OD );.  pPager->
24b20 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
24b30 20 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65    assertTruncate
24b40 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
24b50 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  r);.}.../*.** Th
24b60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
24b70 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
24b80 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
24b90 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
24ba0 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
24bb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
24bc0 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
24bd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
24be0 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
24bf0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
24c00 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
24c10 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
24c20 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
24c30 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
24c40 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
24c50 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
24c60 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
24c70 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
24c80 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
24c90 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
24ca0 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
24cb0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
24cc0 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
24cd0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
24ce0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
24cf0 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
24d00 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
24d10 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
24d20 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
24d30 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
24d40 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
24d50 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
24d60 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
24d70 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
24d80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24d90 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
24da0 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
24db0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
24dc0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
24dd0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
24de0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
24df0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24e00 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
24e10 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
24e20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
24e30 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
24e40 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
24e50 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
24e60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24e70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24e80 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
24e90 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
24ea0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
24eb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24ec0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
24ed0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
24ee0 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
24ef0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
24f00 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
24f10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
24f20 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
24f30 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
24f40 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
24f50 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
24f60 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
24f70 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
24f80 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
24f90 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
24fa0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
24fb0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
24fc0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
24fd0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
24fe0 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
24ff0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
25000 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
25010 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
25020 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
25030 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
25040 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
25050 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
25060 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
25070 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
25080 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
25090 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
250a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
250b0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
250c0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
250d0 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
250e0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
250f0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
25100 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
25110 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
25120 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
25130 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
25140 65 72 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  er){.  u8 *pTmp 
25150 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
25160 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
25170 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
25180 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
25190 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69   );.  disable_si
251a0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
251b0 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
251c0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
251d0 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
251e0 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
251f0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
25200 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
25210 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25220 5f 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61  _WAL.  sqlite3Wa
25230 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  lClose(pPager->p
25240 57 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70  Wal, pPager->ckp
25250 74 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67  tSyncFlags, pPag
25260 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54  er->pageSize, pT
25270 6d 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  mp);.  pPager->p
25280 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  Wal = 0;.#endif.
25290 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
252a0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ager);.  if( MEM
252b0 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  DB ){.    pager_
252c0 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
252d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
252e0 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73  If it is open, s
252f0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
25300 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  file before call
25310 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ing UnlockAndRol
25320 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66  lback..    ** If
25330 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e   this is not don
25340 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e  e, then an unsyn
25350 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
25360 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
25370 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79  .    ** file may
25380 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
25390 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
253a0 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
253b0 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20  ilure occurs .  
253c0 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20    ** while this 
253d0 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68  is happening, th
253e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
253f0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
25400 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
25410 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
25420 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
25430 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  o sync the journ
25440 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61  al, shift the pa
25450 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20  ger.    ** into 
25460 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
25470 20 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c   This causes Unl
25480 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74  ockAndRollback t
25490 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20  o unlock the.   
254a0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64   ** database and
254b0 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
254c0 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  al file without 
254d0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f  attempting to ro
254e0 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63  ll it.    ** bac
254f0 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74  k or finalize it
25500 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62  . The next datab
25510 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61  ase user will ha
25520 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75  ve to do hot-jou
25530 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  rnal.    ** roll
25540 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65  back before acce
25550 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ssing the databa
25560 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
25570 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
25580 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
25590 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
255a0 28 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79  (pPager, pagerSy
255b0 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  ncHotJournal(pPa
255c0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
255d0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
255e0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
255f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
25600 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
25610 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
25620 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
25630 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
25640 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
25650 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
25660 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
25670 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
25680 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  ).  sqlite3OsClo
25690 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
256a0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
256b0 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
256c0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
256d0 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  (pTmp);.  sqlite
256e0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
256f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
25700 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
25710 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50  S_CODEC.  if( pP
25720 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
25730 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65   ) pPager->xCode
25740 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43  cFree(pPager->pC
25750 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  odec);.#endif.. 
25760 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
25770 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20  ->aSavepoint && 
25780 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
25790 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
257a0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
257b0 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
257c0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
257d0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ;..  sqlite3_fre
257e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
257f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25800 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
25810 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
25820 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
25830 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25840 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
25850 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e  page pPg..*/.Pgn
25860 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
25870 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
25880 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
25890 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  pPg->pgno;.}.#en
258a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
258b0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
258c0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67  ce count for pag
258d0 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  e pPg..*/.void s
258e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
258f0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73  bPage *pPg){.  s
25900 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28  qlite3PcacheRef(
25910 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  pPg);.}../*.** S
25920 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
25930 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
25940 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
25950 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
25960 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
25970 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
25980 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
25990 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
259a0 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
259b0 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65  sk and can be re
259c0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76  stored in the ev
259d0 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75  ent of a hot-jou
259e0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  rnal rollback..*
259f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65  *.** If the Page
25a00 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73  r.noSync flag is
25a10 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
25a20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
25a30 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  -op..** Otherwis
25a40 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72  e, the actions r
25a50 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f  equired depend o
25a60 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
25a70 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64  de and the .** d
25a80 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
25a90 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65  stics of the the
25aa0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
25ab0 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
25ac0 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
25ad0 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
25ae0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
25af0 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
25b00 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
25b10 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
25b20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
25b30 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
25b40 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
25b50 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
25b60 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
25b70 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
25b80 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
25b90 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
25ba0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
25bb0 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
25bc0 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
25bd0 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
25be0 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
25bf0 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
25c00 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
25c10 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
25c20 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
25c30 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
25c40 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
25c50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
25c60 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
25c70 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
25c80 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
25c90 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
25ca0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
25cb0 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
25cc0 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
25cd0 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
25ce0 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
25cf0 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
25d00 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
25d10 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
25d20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
25d30 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
25d40 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
25d50 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
25d60 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
25d70 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
25d80 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
25d90 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
25da0 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
25db0 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
25dc0 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
25dd0 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
25de0 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  }.**.** If succe
25df0 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74  ssful, this rout
25e00 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50  ine clears the P
25e10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
25e20 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a  lag of every .**
25e30 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
25e40 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62  held in memory b
25e50 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
25e60 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e  SQLITE_OK. If an
25e70 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20   IO.** error is 
25e80 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
25e90 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
25ea0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
25eb0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
25ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
25ed0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
25ee0 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48  pPager, int newH
25ef0 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  dr){.  int rc;  
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
25f20 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
25f30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
25f40 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
25f50 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
25f60 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
25f70 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
25f80 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73  _DBMOD.  );.  as
25f90 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
25fa0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
25fb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
25fc0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
25fd0 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
25fe0 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
25ff0 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
26000 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
26010 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26020 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
26030 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
26040 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
26050 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
26060 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
26070 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
26080 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
26090 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
260a0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
260b0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
260c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
260d0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
260e0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
260f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
26100 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26110 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
26120 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
26130 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
26140 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
26150 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
26160 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
26170 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
26180 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
26190 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
261a0 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
261b0 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
261c0 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
261d0 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
261e0 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
261f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26200 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
26210 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
26220 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
26230 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
26240 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
26250 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
26260 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
26270 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
26280 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
26290 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
262a0 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
262b0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
262c0 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
262d0 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
262e0 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
262f0 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
26300 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
26310 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
26320 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
26330 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
26340 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
26350 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
26360 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
26370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
26380 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
26390 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
263a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
263b0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
263c0 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
263d0 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
263e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
263f0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
26400 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
26410 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
26420 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
26430 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
26440 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
26450 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
26460 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
26470 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
26480 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
26490 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
264a0 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
264b0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
264c0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
264d0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
264e0 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
264f0 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
26500 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
26510 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
26520 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
26530 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
26540 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
26550 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
26560 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
26570 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
26580 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
26590 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
265a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
265b0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
265c0 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
265d0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
265e0 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
265f0 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
26600 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
26610 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
26620 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
26630 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
26640 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
26650 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
26660 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
26670 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
26680 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
26690 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
266a0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
266b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
266c0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
266d0 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
266e0 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
266f0 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
26700 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
26710 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
26720 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
26730 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
26740 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
26750 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
26760 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
26770 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
26780 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
26790 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
267a0 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
267b0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
267c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
267d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
267e0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
267f0 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
26800 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
26810 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26820 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
26830 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
26840 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
26850 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
26860 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
26870 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
26880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26890 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
268a0 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
268b0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
268c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
268d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
268e0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
268f0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
26900 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
26910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
26920 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
26930 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
26940 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
26950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
26960 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
26970 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
26980 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
26990 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
269a0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
269b0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
269c0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
269d0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
269e0 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
269f0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
26a00 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
26a10 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
26a20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
26a30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26a40 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
26a50 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
26a60 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
26a70 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
26a80 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
26a90 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
26aa0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
26ab0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
26ac0 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
26ad0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
26ae0 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
26af0 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
26b00 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
26b10 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
26b20 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
26b30 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
26b40 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
26b50 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
26b60 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
26b70 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
26b80 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
26b90 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
26ba0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
26bb0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
26bc0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
26bd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
26be0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
26bf0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
26c00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
26c10 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
26c20 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
26c30 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
26c40 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26c50 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
26c60 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
26c70 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
26c80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26c90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
26ca0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
26cb0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
26cc0 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
26cd0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
26ce0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
26cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
26d00 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
26d10 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
26d20 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
26d30 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
26d40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26d50 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
26d60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
26d70 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
26d80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26d90 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
26da0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
26db0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
26dc0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
26dd0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
26de0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
26df0 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
26e00 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
26e10 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
26e20 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
26e30 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
26e40 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
26e50 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
26e60 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
26e70 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
26e80 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
26e90 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
26ea0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
26eb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
26ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26ed0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
26ee0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
26ef0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
26f00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
26f10 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
26f20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
26f30 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
26f40 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
26f50 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
26f60 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
26f70 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
26f80 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
26f90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26fa0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
26fb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26fc0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
26fd0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
26fe0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
26ff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
27000 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
27010 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
27020 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
27030 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
27040 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
27050 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
27060 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
27070 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
27080 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
27090 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
270a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
270b0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
270c0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
270d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
270e0 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
270f0 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
27100 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
27110 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
27120 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
27140 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
27150 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
27160 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
27170 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
27180 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
27190 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
271a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
271b0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
271c0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
271d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
271e0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
271f0 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
27200 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
27210 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
27220 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
27230 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
27240 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
27250 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
27260 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
27270 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
27280 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
27290 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
272a0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
272b0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
272c0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
272d0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
272e0 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
272f0 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
27300 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
27310 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
27320 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
27330 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
27340 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
27350 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
27360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27370 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
27380 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
27390 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
273a0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
273b0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
273c0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
273d0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
273e0 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
273f0 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
27400 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
27410 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
27420 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
27430 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
27440 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
27450 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
27460 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
27470 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
27480 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
27490 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
274a0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
274b0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
274c0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
274d0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
274e0 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
274f0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
27500 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
27510 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
27520 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
27530 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
27540 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
27550 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
27560 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
27570 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
27580 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
27590 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
275a0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
275b0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
275c0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
275d0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
275e0 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
275f0 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
27600 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
27610 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
27620 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
27630 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
27640 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
27650 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
27660 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
27670 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
27680 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
27690 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
276a0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
276b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
276c0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
276d0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
276e0 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
276f0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
27700 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
27710 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
27720 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
27730 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
27740 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
27750 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27770 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
27780 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
27790 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
277a0 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
277b0 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
277c0 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
277d0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
277e0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
277f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
27800 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
27810 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
27820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
27830 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
27840 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
27850 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
27860 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68  is a temp-file h
27870 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
27880 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
27890 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20  now. It.  ** is 
278a0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
278b0 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20   rc to be other 
278c0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  than SQLITE_OK i
278d0 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  f this branch.  
278e0 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20  ** is taken, as 
278f0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
27900 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
27910 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a  for temp-files..
27920 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70    */.  if( !isOp
27930 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
27940 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
27950 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
27960 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
27970 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
27980 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
27990 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
279a0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
279b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
279c0 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74  e the first writ
279d0 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20  e, give the VFS 
279e0 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74  a hint of what t
279f0 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69  he final.  ** fi
27a00 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e  le size will be.
27a10 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27a20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
27a30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27a40 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  fd) );.  if( rc=
27a50 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
27a60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 70 50 61  ager->dbSize>pPa
27a70 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
27a80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
27a90 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50  nt64 szFile = pP
27aa0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a  ager->pageSize *
27ab0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
27ac0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
27ad0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
27ae0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
27af0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
27b00 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c  FCNTL_SIZE_HINT,
27b10 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70   &szFile);.    p
27b20 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
27b30 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
27b40 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ze;.  }..  while
27b50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27b60 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  && pList ){.    
27b70 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73  Pgno pgno = pLis
27b80 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a  t->pgno;..    /*
27b90 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
27ba0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
27bb0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
27bc0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
27bd0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
27be0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
27bf0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
27c00 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
27c10 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  mage() was calle
27c20 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
27c30 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
27c40 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
27c50 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
27c60 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
27c70 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
27c80 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
27c90 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
27ca0 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77  * Also, do not w
27cb0 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67  rite out any pag
27cc0 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50  e that has the P
27cd0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20  GHDR_DONT_WRITE 
27ce0 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20  flag.    ** set 
27cf0 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50  (set by sqlite3P
27d00 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29  agerDontWrite())
27d10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
27d20 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64   pgno<=pPager->d
27d30 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
27d40 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
27d50 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
27d60 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
27d70 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
27d80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
27d90 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  ;   /* Offset to
27da0 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20   write */.      
27db0 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20  char *pData;    
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27de0 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
27df0 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73  */    ..      as
27e00 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c  sert( (pList->fl
27e10 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
27e20 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
27e30 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
27e40 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74  ==1 ) pager_writ
27e50 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  e_changecounter(
27e60 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pList);..      /
27e70 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74  * Encode the dat
27e80 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43  abase */.      C
27e90 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
27ea0 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f  ist->pData, pgno
27eb0 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  , 6, return SQLI
27ec0 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29  TE_NOMEM, pData)
27ed0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
27ee0 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
27ef0 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
27f00 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
27f10 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
27f20 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
27f30 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
27f40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
27f50 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
27f60 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
27f70 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
27f80 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
27f90 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
27fa0 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
27fb0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
27fc0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
27fd0 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
27fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27ff0 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
28000 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
28010 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
28020 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
28030 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
28040 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
28050 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
28060 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
28070 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
28080 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
28090 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
280a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
280b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
280c0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
280d0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   }..      /* Upd
280e0 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
280f0 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
28100 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
28110 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
28120 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
28130 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
28140 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
28150 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61 74 61  u8*)pList->pData
28160 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54  );..      PAGERT
28170 52 41 43 45 28 28 22 53 54 4f 52 45 20 25 64 20  RACE(("STORE %d 
28180 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
28190 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
281a0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
281b0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
281c0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
281d0 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
281e0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
281f0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
28200 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  , pgno));.      
28210 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
28220 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
28230 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50  _count);.      P
28240 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
28250 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d  ->nWrite);.    }
28260 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
28270 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45  RTRACE(("NOSTORE
28280 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
28290 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
282a0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20   pgno));.    }. 
282b0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
282c0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20  ehash(pList);.  
282d0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
282e0 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20  >pDirty;.  }..  
282f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28300 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
28310 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
28320 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66  file is open. If
28330 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
28340 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  pen, this .** fu
28350 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
28360 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
28370 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
28380 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
28390 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  s according to p
283a0 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49  lan. An .** SQLI
283b0 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
283c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
283d0 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ned if a call to
283e0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
283f0 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73   .** fails..*/.s
28400 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
28410 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
28420 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
28430 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28440 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
28450 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
28460 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
28470 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
28480 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
28490 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ORY || pPager->s
284a0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20  ubjInMemory ){. 
284b0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
284c0 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
284d0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
284e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
284f0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
28500 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
28510 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
28520 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
28530 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
28540 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
28550 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20  end a record of 
28560 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
28570 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f  e of page pPg to
28580 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
28590 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  . .** It is the 
285a0 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
285b0 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75  bility to use su
285c0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
285d0 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68   to check .** th
285e0 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  at it is really 
285f0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
28600 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
28610 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
28620 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
28630 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
28640 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
28650 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
28660 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
28670 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
28680 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
28690 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
286a0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
286b0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
286c0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
286d0 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
286e0 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
286f0 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
28700 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
28710 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
28720 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
28730 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
28740 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
28750 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
28760 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
28770 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
28780 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
28790 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
287a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
287b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
287c0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
287d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
287e0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
287f0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 0a  NALMODE_OFF ){..
28800 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
28810 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
28820 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
28830 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 2a  dy been opened *
28840 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
28850 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
28860 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
28870 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
28880 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65 57  fd) || pagerUseW
28890 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
288a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
288b0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c  (pPager->sjfd) |
288c0 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  | pPager->nSubRe
288d0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
288e0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
288f0 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20 20  pPager) .       
28900 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72 6e    || pageInJourn
28910 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20 20 20  al(pPg) .       
28920 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
28930 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
28940 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63  e .    );.    rc
28950 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
28960 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  l(pPager);..    
28970 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f  /* If the sub-jo
28980 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64  urnal was opened
28990 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f   successfully (o
289a0 72 20 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70  r was already op
289b0 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74  en),.    ** writ
289c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  e the journal re
289d0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69  cord into the fi
289e0 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  le.  */.    if( 
289f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28a00 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
28a10 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
28a20 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
28a30 74 20 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d  t = (i64)pPager-
28a40 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
28a50 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
28a60 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
28a70 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45  2;.  .      CODE
28a80 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
28a90 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20  , pPg->pgno, 7, 
28aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
28ab0 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  MEM, pData2);.  
28ac0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28ad0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
28ae0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
28af0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
28b00 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
28b10 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
28b20 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  s(pPager->sjfd, 
28b30 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
28b40 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
28b50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28b60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28b70 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
28b80 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c  r->sjfd, pData2,
28b90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
28ba0 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
28bb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
28bc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
28bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
28be0 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
28bf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28c00 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
28c10 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
28c20 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
28c30 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
28c40 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
28c50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
28c60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
28c70 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
28c80 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
28c90 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
28ca0 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
28cb0 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
28cc0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
28cd0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
28ce0 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
28cf0 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
28d00 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
28d10 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
28d20 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
28d30 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
28d40 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
28d50 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
28d60 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
28d70 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
28d80 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
28d90 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
28da0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
28db0 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
28dc0 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
28dd0 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
28de0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
28df0 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
28e00 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
28e10 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
28e20 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
28e30 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
28e40 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
28e50 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
28e60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
28e70 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
28e80 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
28e90 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
28ea0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
28eb0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
28ec0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
28ed0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
28ee0 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
28ef0 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
28f00 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
28f10 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
28f20 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
28f30 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
28f40 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
28f50 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
28f60 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
28f70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
28f80 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
28f90 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
28fa0 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
28fb0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
28fc0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
28fd0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
28fe0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
28ff0 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
29000 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
29010 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
29020 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
29030 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
29040 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
29050 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29060 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
29070 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
29080 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
29090 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
290a0 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a  R_DIRTY );..  /*
290b0 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70   The doNotSyncSp
290c0 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65 74 20  ill flag is set 
290d0 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65  during times whe
290e0 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f  n doing a sync o
290f0 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  f.  ** journal (
29100 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77  and adding a new
29110 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20   header) is not 
29120 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f  allowed.  This o
29130 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
29140 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  g calls to sqlit
29150 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 77  e3PagerWrite() w
29160 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a  hile trying to j
29170 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a  ournal multiple.
29180 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e    ** pages belon
29190 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65  ging to the same
291a0 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20   sector..  **.  
291b0 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  ** The doNotSpil
291c0 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74 73 20  l flag inhibits 
291d0 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69  all cache spilli
291e0 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
291f0 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20 6f 72   whether.  ** or
29200 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72   not a sync is r
29210 65 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69  equired.  This i
29220 73 20 73 65 74 20 64 75 72 69 6e 67 20 61 20 72  s set during a r
29230 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20  ollback..  **.  
29240 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61  ** Spilling is a
29250 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77  lso prohibited w
29260 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  hen in an error 
29270 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74  state since that
29280 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64   could.  ** lead
29290 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
292a0 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68  ruption.   In th
292b0 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
292c0 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20 2a 2a  entaton it .  **
292d0 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
292e0 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  or sqlite3Pcache
292f0 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63 61  Fetch() to be ca
29300 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74 65  lled with create
29310 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77 68 69  Flag==1.  ** whi
29320 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  le in the error 
29330 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74 20  state, hence it 
29340 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f  is impossible fo
29350 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
29360 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  o.  ** be called
29370 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
29380 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c 65  ate.  Neverthele
29390 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20 61  ss, we include a
293a0 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74 65   NEVER().  ** te
293b0 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72  st for the error
293c0 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66 65   state as a safe
293d0 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66 75  guard against fu
293e0 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20 20  ture changes..  
293f0 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
29400 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
29410 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29420 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
29430 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29 20 72  ->doNotSpill ) r
29440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29450 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
29460 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 26 26  oNotSyncSpill &&
29470 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
29480 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
29490 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
294a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
294b0 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
294c0 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55   0;.  if( pagerU
294d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
294e0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  .    /* Write a 
294f0 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72  single frame for
29500 20 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68   this page to th
29510 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 69 66  e log. */.    if
29520 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  ( subjRequiresPa
29530 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20 20 20  ge(pPg) ){ .    
29540 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
29550 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20 20 20  lPage(pPg); .   
29560 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
29570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29580 20 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46    rc = pagerWalF
29590 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50  rames(pPager, pP
295a0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  g, 0, 0);.    }.
295b0 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
295c0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
295d0 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
295e0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
295f0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
29600 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
29610 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
29620 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
29630 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
29640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
29650 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
29660 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
29670 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
29680 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20   number of this 
29690 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20 74  page is larger t
296a0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
296b0 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74  size of.    ** t
296c0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
296d0 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74  e, it may need t
296e0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  o be written to 
296f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
29700 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20  .    ** This is 
29710 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
29720 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74 65 5f   to pager_write_
29730 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c 6f 77  pagelist() below
29740 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 2a 2a   will not.    **
29750 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 65 20   actually write 
29760 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65  data to the file
29770 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
29780 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6f 6e     **.    ** Con
29790 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77  sider the follow
297a0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
297b0 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a 0a 20  events:.    **. 
297c0 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20     **   BEGIN;. 
297d0 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e     **     <journ
297e0 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a  al page X>.    *
297f0 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61  *     <modify pa
29800 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
29810 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
29820 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73 68 72     **       <shr
29830 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c  ink database fil
29840 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a 20 20  e to Y pages>.  
29850 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
29860 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
29870 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41     **     ROLLBA
29880 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 2a 2a  CK TO sp;.    **
29890 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  .    ** If (X>Y)
298a0 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
298b0 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
298c0 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
298d0 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 20  t be written.   
298e0 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64   ** out to the d
298f0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75  atabase file, bu
29900 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  t will be droppe
29910 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
29920 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a 20 66  . Then,.    ** f
29930 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f  ollowing the "RO
29940 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74  LLBACK TO sp" st
29950 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67  atement, reading
29960 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61   page X will rea
29970 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 66 72  d.    ** data fr
29980 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
29990 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  file. This will 
299a0 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66 20 70  be the copy of p
299b0 61 67 65 20 58 20 61 73 20 69 74 0a 20 20 20 20  age X as it.    
299c0 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68 65 20  ** was when the 
299d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
299e0 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74 20 77  ted, not as it w
299f0 61 73 20 77 68 65 6e 20 22 53 41 56 45 50 4f 49  as when "SAVEPOI
29a00 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20 77 61  NT sp".    ** wa
29a10 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  s executed..    
29a20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
29a30 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69  lution is to wri
29a40 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  te the current d
29a50 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69  ata for page X i
29a60 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
29a70 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
29a80 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
29a90 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
29aa0 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
29ab0 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 73  ll.    ** be res
29ac0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75 72  tored to its cur
29ad0 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20  rent value when 
29ae0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
29af0 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a 2a 20   sp" is .    ** 
29b00 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 2a 2f  executed..    */
29b10 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 0a  .    if( NEVER(.
29b20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
29b30 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e 70 67  TE_OK && pPg->pg
29b40 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  no>pPager->dbSiz
29b50 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65  e && subjRequire
29b60 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 20 29  sPage(pPg).    )
29b70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
29b80 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
29b90 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  g);.    }.  .   
29ba0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
29bb0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
29bc0 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  ge out to the da
29bd0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
29be0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29bf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
29c00 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
29c10 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29c20 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
29c30 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
29c40 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65 72  _pagelist(pPager
29c50 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  , pPg);.    }.  
29c60 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
29c70 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
29c80 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
29c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
29ca0 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
29cb0 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
29cc0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29cd0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
29ce0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
29cf0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
29d00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
29d10 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
29d20 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  , rc); .}.../*.*
29d30 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
29d40 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
29d50 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
29d60 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
29d70 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
29d80 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
29d90 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
29da0 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
29db0 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
29dc0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
29dd0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
29de0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
29df0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
29e00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29e10 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
29e20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
29e30 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
29e40 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
29e50 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
29e60 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
29e70 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
29e80 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
29e90 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
29ea0 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
29eb0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
29ec0 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
29ed0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
29ee0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
29ef0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
29f00 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
29f10 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
29f20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
29f30 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
29f40 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
29f50 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
29f60 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
29f70 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
29f80 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
29f90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
29fa0 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
29fb0 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
29fc0 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
29fd0 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
29fe0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
29ff0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2a000 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2a010 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2a020 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
2a030 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2a040 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2a050 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2a060 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2a070 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2a080 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2a090 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2a0a0 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2a0b0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2a0c0 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2a0d0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2a0e0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2a0f0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2a100 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2a110 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2a120 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2a130 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2a140 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2a150 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2a160 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2a170 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2a180 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2a190 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2a1a0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2a1b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2a1c0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2a1d0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2a1e0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2a1f0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2a200 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2a210 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2a220 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2a230 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2a240 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2a250 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2a260 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2a270 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2a280 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2a290 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2a2a0 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2a2b0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2a2c0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2a2d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2a2e0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2a2f0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2a300 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2a310 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2a320 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2a330 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2a340 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2a350 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2a360 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2a370 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2a380 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2a390 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2a3a0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2a3b0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2a3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2a3d0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2a3e0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2a3f0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2a400 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2a410 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2a420 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2a430 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2a440 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2a450 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2a460 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2a470 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2a480 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2a490 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2a4a0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2a4b0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2a4c0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2a4d0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2a4e0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2a4f0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2a500 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2a510 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2a520 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2a530 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a540 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2a550 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2a560 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2a570 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2a580 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2a590 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2a5a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2a5b0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2a5c0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2a5d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2a5e0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2a5f0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2a600 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2a610 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2a620 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2a630 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2a640 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2a650 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2a660 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2a670 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2a680 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2a690 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2a6a0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2a6b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a6c0 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2a6d0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2a6e0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2a6f0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2a700 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2a710 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2a720 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2a730 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2a740 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2a750 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2a760 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2a770 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2a780 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2a790 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2a7a0 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2a7b0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2a7c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2a7d0 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2a7e0 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2a7f0 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2a800 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a810 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2a820 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2a830 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2a840 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2a850 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2a860 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2a870 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2a880 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2a890 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2a8a0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2a8b0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2a8c0 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
2a8d0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
2a8e0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
2a8f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2a900 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2a910 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
2a920 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2a930 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
2a940 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
2a950 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
2a960 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
2a970 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
2a980 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
2a990 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
2a9a0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
2a9b0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
2a9c0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
2a9d0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2a9e0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
2a9f0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
2aa00 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
2aa10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
2aa20 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
2aa30 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2aa40 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
2aa50 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2aa60 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2aa70 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2aa80 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2aa90 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2aaa0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2aab0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2aac0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
2aad0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2aae0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2aaf0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2ab00 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2ab10 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2ab20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2ab30 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2ab40 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2ab50 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2ab60 20 31 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d   1;.    zFilenam
2ab70 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  e = 0;.  }.#endi
2ab80 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2ab90 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2aba0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2abb0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2abc0 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2abd0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2abe0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2abf0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2ac00 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2ac10 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2ac20 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2ac30 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2ac40 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2ac50 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2ac60 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2ac70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2ac80 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2ac90 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2aca0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2acb0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
2acc0 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
2acd0 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
2ace0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
2acf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2ad00 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50  EM;.    }.    zP
2ad10 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20  athname[0] = 0; 
2ad20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69  /* Make sure ini
2ad30 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66  tialized even if
2ad40 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20   FullPathname() 
2ad50 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20  fails */.    rc 
2ad60 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
2ad70 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2ad80 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
2ad90 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
2ada0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2adb0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2adc0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2add0 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c  z = zUri = &zFil
2ade0 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72  ename[sqlite3Str
2adf0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
2ae00 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
2ae10 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d  *z ){.      z +=
2ae20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2ae30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b  (z)+1;.      z +
2ae40 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2ae50 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  0(z)+1;.    }.  
2ae60 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26    nUri = (int)(&
2ae70 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20  z[1] - zUri);.  
2ae80 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d    assert( nUri>=
2ae90 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
2aea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50  =SQLITE_OK && nP
2aeb0 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e  athname+8>pVfs->
2aec0 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  mxPathname ){.  
2aed0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
2aee0 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
2aef0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74   the journal pat
2af00 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  h required by.  
2af10 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2af20 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ase being opened
2af30 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68   will be more th
2af40 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  an pVfs->mxPathn
2af50 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
2af60 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68  es in length. Th
2af70 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74  is means the dat
2af80 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
2af90 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a  opened,.      **
2afa0 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20   as it will not 
2afb0 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f  be possible to o
2afc0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
2afd0 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20  file or even.   
2afe0 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20     ** check for 
2aff0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65  a hot-journal be
2b000 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20  fore reading..  
2b010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2b020 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
2b030 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  N_BKPT;.    }.  
2b040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2b060 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
2b070 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
2b080 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
2b090 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2b0a0 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50  memory for the P
2b0b0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
2b0c0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74  PCache object, t
2b0d0 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69  he.  ** three fi
2b0e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20  le descriptors, 
2b0f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b100 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a  e name and the j
2b110 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
2b120 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f  e name. The layo
2b130 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20  ut in memory is 
2b140 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a  as follows:.  **
2b150 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20  .  **     Pager 
2b160 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2b170 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f            (sizeo
2b180 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a  f(Pager) bytes).
2b190 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20    **     PCache 
2b1a0 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20  object          
2b1b0 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
2b1c0 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79  3PcacheSize() by
2b1d0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2b1e0 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64  tabase file hand
2b1f0 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70  le            (p
2b200 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79  Vfs->szOsFile by
2b210 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75  tes).  **     Su
2b220 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  b-journal file h
2b230 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a  andle         (j
2b240 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2b250 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d  ytes).  **     M
2b260 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
2b270 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28   handle        (
2b280 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2b290 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2b2a0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  Database file na
2b2b0 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
2b2c0 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74  (nPathname+1 byt
2b2d0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75  es).  **     Jou
2b2e0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20  rnal file name  
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2b300 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65  athname+8+1 byte
2b310 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d  s).  */.  pPtr =
2b320 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61   (u8 *)sqlite3Ma
2b330 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f  llocZero(.    RO
2b340 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61  UND8(sizeof(*pPa
2b350 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20  ger)) +      /* 
2b360 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2b370 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63  */.    ROUND8(pc
2b380 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20  acheSize) +     
2b390 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
2b3a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f  object */.    RO
2b3b0 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46  UND8(pVfs->szOsF
2b3c0 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  ile) +       /* 
2b3d0 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
2b3e0 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
2b3f0 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
2b400 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
2b410 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  o journal files 
2b420 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d  */ .    nPathnam
2b430 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20  e + 1 + nUri +  
2b440 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
2b450 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68  ame */.    nPath
2b460 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20  name + 8 + 2    
2b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f            /* zJo
2b480 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66  urnal */.#ifndef
2b490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2b4a0 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65  .    + nPathname
2b4b0 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20   + 4 + 2        
2b4c0 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23      /* zWal */.#
2b4d0 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73  endif.  );.  ass
2b4e0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2b4f0 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45  ALIGNMENT(SQLITE
2b500 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72  _INT_TO_PTR(jour
2b510 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b  nalFileSize)) );
2b520 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a  .  if( !pPtr ){.
2b530 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b540 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2b550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2b560 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67  OMEM;.  }.  pPag
2b570 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  er =            
2b580 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29    (Pager*)(pPtr)
2b590 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61  ;.  pPager->pPCa
2b5a0 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65  che =    (PCache
2b5b0 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2b5c0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2b5d0 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  )));.  pPager->f
2b5e0 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66  d =   (sqlite3_f
2b5f0 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f  ile*)(pPtr += RO
2b600 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2b610 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66  );.  pPager->sjf
2b620 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  d = (sqlite3_fil
2b630 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2b640 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2b650 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  e));.  pPager->j
2b660 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66  fd =  (sqlite3_f
2b670 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  ile*)(pPtr += jo
2b680 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2b690 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
2b6a0 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29  ame =    (char*)
2b6b0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2b6c0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73  FileSize);.  ass
2b6d0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2b6e0 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
2b6f0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20  ->jfd) );..  /* 
2b700 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65  Fill in the Page
2b710 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20  r.zFilename and 
2b720 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62  Pager.zJournal b
2b730 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69  uffers, if requi
2b740 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50  red. */.  if( zP
2b750 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61  athname ){.    a
2b760 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65  ssert( nPathname
2b770 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  >0 );.    pPager
2b780 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28  ->zJournal =   (
2b790 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e  char*)(pPtr += n
2b7a0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2b7b0 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2b7c0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2b7d0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
2b7e0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2b7f0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2b800 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
2b810 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72  me+1], zUri, nUr
2b820 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2b830 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2b840 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2b850 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2b860 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
2b870 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
2b880 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c   "-journal\000",
2b890 20 38 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74   8+1);.    sqlit
2b8a0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2b8b0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2b8c0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2b8d0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2b8e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2b8f0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26  pPager->zWal = &
2b900 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2b910 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b  [nPathname+8+1];
2b920 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2b930 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e  er->zWal, zPathn
2b940 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2b950 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2b960 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e  ger->zWal[nPathn
2b970 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22  ame], "-wal\000"
2b980 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  , 4+1);.    sqli
2b990 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2b9a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2b9b0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b  , pPager->zWal);
2b9c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
2b9d0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
2b9e0 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2b9f0 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2ba00 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2ba10 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2ba20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2ba30 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2ba40 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2ba50 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2ba60 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2ba70 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ba80 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2ba90 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2baa0 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2bab0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2bac0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2bad0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2bae0 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2baf0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2bb00 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20  ert( !memDb );. 
2bb10 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
2bb20 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2bb30 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
2bb40 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
2bb50 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
2bb60 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
2bb70 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
2bb80 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
2bb90 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2bba0 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
2bbb0 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
2bbc0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2bbd0 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
2bbe0 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
2bbf0 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
2bc00 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
2bc10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2bc20 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
2bc30 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
2bc40 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2bc50 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
2bc60 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
2bc70 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
2bc80 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
2bc90 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
2bca0 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2bcb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bcc0 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b   && !readOnly ){
2bcd0 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72  .      setSector
2bce0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2bcf0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2bd00 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2bd10 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
2bd20 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bd30 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  E);.      if( sz
2bd40 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d  PageDflt<pPager-
2bd50 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20  >sectorSize ){. 
2bd60 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2bd70 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51  r->sectorSize>SQ
2bd80 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2bd90 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
2bda0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2bdb0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
2bdc0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2bdd0 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  E;.        }else
2bde0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
2bdf0 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2be00 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2be10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2be20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2be30 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2be40 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20  WRITE.      {.  
2be50 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2be60 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2be70 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2be80 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2be90 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2bea0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2beb0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
2bec0 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
2bed0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2bee0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2bef0 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
2bf00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2bf10 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2bf20 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2bf30 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66  5536);.        f
2bf40 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
2bf50 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
2bf60 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2bf70 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
2bf80 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2bf90 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2bfa0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2bfb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2bfc0 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
2bfd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bfe0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
2bff0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  if.    }.  }else
2c000 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
2c010 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2c020 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
2c030 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
2c040 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
2c050 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
2c060 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
2c070 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
2c080 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
2c090 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
2c0a0 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
2c0b0 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
2c0c0 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
2c0d0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2c0e0 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
2c0f0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2c100 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
2c110 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
2c120 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
2c130 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
2c140 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
2c150 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
2c160 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
2c170 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
2c180 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
2c190 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  nal..    */ .   
2c1a0 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
2c1b0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
2c1c0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
2c1d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c  ;.    pPager->eL
2c1e0 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ock = EXCLUSIVE_
2c1f0 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 61 64 4f 6e  LOCK;.    readOn
2c200 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
2c210 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2c220 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
2c230 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
2c240 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
2c250 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
2c260 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
2c270 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
2c280 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
2c290 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
2c2a0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
2c2b0 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
2c2c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c2d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2c2e0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
2c2f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c300 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
2c310 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
2c320 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
2c330 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
2c340 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
2c350 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2c360 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74   occurred in eit
2c370 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
2c380 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
2c390 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
2c3a0 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
2c3b0 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
2c3c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c3d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2c3e0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
2c3f0 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
2c400 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2c410 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
2c420 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
2c430 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
2c440 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
2c450 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2c460 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2c470 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
2c480 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20  000 );.  nExtra 
2c490 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
2c4a0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
2c4b0 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
2c4c0 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
2c4d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c4e0 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
2c4f0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
2c500 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
2c510 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
2c520 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
2c530 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
2c540 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
2c550 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
2c560 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
2c570 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
2c580 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
2c590 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2c5a0 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
2c5b0 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
2c5c0 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20  seJournal;.  /* 
2c5d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
2c5e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2c5f0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
2c600 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2c610 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
2c620 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2c630 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
2c640 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2c650 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
2c660 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
2c670 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
2c680 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
2c690 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
2c6a0 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
2c6b0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
2c6c0 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a  NLOCK; */.#if 0.
2c6d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c6e0 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
2c6f0 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
2c700 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
2c710 4e 4c 4f 43 4b 29 20 29 3b 0a 23 65 6e 64 69 66  NLOCK) );.#endif
2c720 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
2c730 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
2c740 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2c750 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2c760 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
2c770 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2c780 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
2c790 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
2c7a0 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2c7b0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2c7c0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2c7d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2c7e0 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
2c7f0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
2c800 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
2c810 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
2c820 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2c830 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
2c840 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2c850 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
2c860 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
2c870 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
2c880 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
2c890 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
2c8a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2c8b0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
2c8c0 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
2c8d0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2c8e0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50  r->fullSync = pP
2c8f0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a  ager->noSync ?0:
2c900 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  1;.  pPager->syn
2c910 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d  cFlags = pPager-
2c920 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53 51  >noSync ? 0 : SQ
2c930 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2c940 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  ;.  pPager->ckpt
2c950 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67  SyncFlags = pPag
2c960 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20  er->syncFlags;. 
2c970 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
2c980 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
2c990 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
2c9a0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ync==0 );.    as
2c9b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79  sert( pPager->sy
2c9c0 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2c9d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2c9e0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d  ->walSyncFlags==
2c9f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2ca00 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
2ca10 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
2ca20 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
2ca30 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
2ca40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2ca50 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2ca60 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2ca70 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2ca80 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2ca90 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2caa0 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2cab0 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2cac0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2cad0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2cae0 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2caf0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2cb00 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2cb10 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2cb20 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2cb30 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2cb40 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2cb50 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2cb60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2cb70 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2cb80 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2cb90 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2cba0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2cbb0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2cbc0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2cbd0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2cbe0 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2cbf0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2cc00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2cc10 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2cc20 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2cc30 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2cc40 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2cc50 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2cc60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2cc70 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2cc80 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2cc90 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2cca0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2ccb0 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2ccc0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2ccd0 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2cce0 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2ccf0 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2cd00 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2cd10 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  )); */..  *ppPag
2cd20 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
2cd30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cd40 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .}..../*.** This
2cd50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2cd60 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2cd70 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2cd80 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2cd90 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2cda0 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2cdb0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2cdc0 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2cdd0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2cde0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2cdf0 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2ce00 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2ce10 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2ce20 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2ce30 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2ce40 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2ce50 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2ce60 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2ce70 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2ce80 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2ce90 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2cea0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2ceb0 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2cec0 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2ced0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2cee0 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2cef0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2cf00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2cf10 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2cf20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2cf30 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2cf40 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2cf50 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2cf60 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2cf70 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2cf80 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2cf90 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2cfa0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2cfb0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2cfc0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2cfd0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2cfe0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2cff0 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2d000 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2d010 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2d020 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2d030 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2d040 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2d050 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d060 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2d070 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2d080 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2d090 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2d0a0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2d0b0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2d0c0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2d0d0 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2d0e0 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2d0f0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2d100 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2d110 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2d120 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2d130 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2d140 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2d150 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2d160 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2d170 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2d180 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2d190 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2d1a0 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2d1b0 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2d1c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2d1d0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2d1e0 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2d1f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2d200 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2d210 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2d220 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2d230 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2d240 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2d250 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2d260 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2d270 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2d280 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2d290 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2d2a0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2d2b0 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2d2c0 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2d2d0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2d2e0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2d2f0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2d300 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2d310 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2d320 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2d330 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2d340 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2d350 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2d360 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2d370 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2d380 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2d390 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2d3a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2d3b0 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2d3c0 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2d3d0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2d3e0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2d3f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d400 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2d410 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2d420 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2d430 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2d440 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2d450 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2d460 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2d470 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2d480 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2d490 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2d4a0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2d4b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2d4c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2d4d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2d4e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2d4f0 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2d500 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2d510 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2d520 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2d530 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2d540 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2d550 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2d560 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2d570 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2d580 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2d590 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2d5a0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2d5b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2d5c0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2d5d0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2d5e0 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2d5f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d600 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2d610 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2d620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d630 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2d640 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2d650 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
2d660 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
2d670 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
2d680 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2d690 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
2d6a0 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
2d6b0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2d6c0 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
2d6d0 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
2d6e0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2d6f0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
2d700 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
2d710 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2d720 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
2d730 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
2d740 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
2d750 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
2d760 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2d770 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
2d780 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
2d790 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
2d7a0 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
2d7b0 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
2d7c0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
2d7d0 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
2d7e0 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
2d7f0 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
2d800 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
2d810 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
2d820 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
2d830 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
2d840 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
2d850 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
2d860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
2d870 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2d880 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
2d890 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
2d8a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d8b0 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
2d8c0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
2d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d8e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2d8f0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2d900 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68   */..      /* Ch
2d910 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20  eck the size of 
2d920 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d930 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74  e. If it consist
2d940 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20  s of 0 pages,.  
2d950 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65      ** then dele
2d960 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
2d970 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61  ile. See the hea
2d980 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  der comment abov
2d990 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  e for .      ** 
2d9a0 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65  the reasoning he
2d9b0 72 65 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  re.  Delete the 
2d9c0 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
2d9d0 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 20   file under.    
2d9e0 20 20 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20    ** a RESERVED 
2d9f0 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64 20 72 61  lock to avoid ra
2da00 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e  ce conditions an
2da10 64 20 74 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61  d to avoid viola
2da20 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48  ting.      ** [H
2da30 33 33 30 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f  33020]..      */
2da40 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2da50 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2da60 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2da70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2da80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
2da90 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
2daa0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2dab0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2dac0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
2dad0 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70  f( pagerLockDb(p
2dae0 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
2daf0 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
2db00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2db10 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
2db20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2db30 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
2db40 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2db50 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2db60 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b  de ) pagerUnlock
2db70 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2db80 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
2db90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2dba0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
2dbb0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2dbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2dbd0 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
2dbe0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2dbf0 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2dc00 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72  tion has a reser
2dc10 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ved.          **
2dc20 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2dc30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2dc40 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b   file. Now check
2dc50 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20   that there is. 
2dc60 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c           ** at l
2dc70 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72  east one non-zer
2dc80 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  o bytes at the s
2dc90 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2dca0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
2dcb0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
2dcc0 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73  is, then we cons
2dcd0 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61  ider this journa
2dce0 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20  l to be hot. If 
2dcf0 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  not, .          
2dd00 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e  ** it can be ign
2dd10 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ored..          
2dd20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2dd30 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2dd40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
2dd50 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  = .#if SQLITE_EN
2dd60 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
2dd70 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  TION.           
2dd80 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46     (pPager->vfsF
2dd90 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2dda0 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f  _FILEPROTECTION_
2ddb0 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20  MASK)|.#endif.  
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2ddd0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2dde0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2ddf0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
2de00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2de10 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2de20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2de30 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2de40 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20  , &f);.         
2de50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2de60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2de70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
2de80 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
2de90 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2dea0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
2deb0 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
2dec0 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
2ded0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2dee0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
2def0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
2df00 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2df10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2df20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df30 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2df40 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2df50 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
2df60 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
2df70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2df80 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2df90 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
2dfa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2dfb0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2dfc0 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
2dfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2dfe0 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
2dff0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
2e000 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
2e010 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
2e020 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68          ** its h
2e030 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
2e040 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
2e050 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
2e060 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
2e070 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
2e080 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
2e090 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
2e0a0 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
2e0b0 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
2e0c0 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
2e0d0 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
2e0e0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
2e0f0 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
2e100 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
2e110 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
2e120 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
2e130 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
2e140 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
2e150 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
2e160 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
2e170 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
2e180 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
2e190 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
2e1a0 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
2e1b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
2e1c0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
2e1d0 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
2e1e0 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
2e1f0 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
2e200 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
2e210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e220 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
2e230 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
2e240 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2e250 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e260 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2e270 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2e280 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2e290 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2e2a0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
2e2b0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
2e2c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e2d0 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
2e2e0 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
2e2f0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
2e300 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  () until after t
2e310 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
2e320 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e330 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66  fully called. If
2e340 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69   a shared-lock i
2e350 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77  s already held w
2e360 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
2e370 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2e380 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
2e390 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2e3a0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  ng operations ar
2e3b0 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64  e also performed
2e3c0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
2e3d0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66  n..**.**   1) If
2e3e0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
2e3f0 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52  rrently in PAGER
2e400 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20  _OPEN state (no 
2e410 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20  lock held.**    
2e420 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73    on the databas
2e430 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e  e file), then an
2e440 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
2e450 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20   to obtain a.** 
2e460 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b       SHARED lock
2e470 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2e480 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65   file. Immediate
2e490 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
2e4a0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53  ng.**      the S
2e4b0 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
2e4c0 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63  file-system is c
2e4d0 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74  hecked for a hot
2e4e0 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20  -journal,.**    
2e4f0 20 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65    which is playe
2e500 64 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e  d back if presen
2e510 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79  t. Following any
2e520 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   hot-journal .**
2e530 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20        rollback, 
2e540 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2e550 74 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61  the cache are va
2e560 6c 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b  lidated by check
2e570 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
2e580 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27  'change-counter'
2e590 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61   field of the da
2e5a0 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64  tabase file head
2e5b0 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64  er and.**      d
2e5c0 69 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79  iscarded if they
2e5d0 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65   are found to be
2e5e0 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20   invalid..**.** 
2e5f0 20 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65    2) If the page
2e600 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
2e610 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20  exclusive-mode, 
2e620 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75  and there are cu
2e630 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
2e640 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
2e650 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79  eferences to any
2e660 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69   pages, and is i
2e670 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2e680 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20  e,.**      then 
2e690 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
2e6a0 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20  de to clear the 
2e6b0 65 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64  error state by d
2e6c0 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20  iscarding.**    
2e6d0 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
2e6e0 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2e6f0 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63   and rolling bac
2e700 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e  k any open journ
2e710 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e  al.**      file.
2e720 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
2e730 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2e740 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
2e750 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2e760 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
2e770 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69  curs while locki
2e780 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ng the database,
2e790 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20   checking for a 
2e7a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2e7b0 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20   or .** rolling 
2e7c0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66  back a journal f
2e7d0 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ile, the IO erro
2e7e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2e7f0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2e800 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
2e810 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
2e820 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2e830 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2e840 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2e850 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
2e860 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
2e870 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  nly called from 
2e880 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20  b-tree and only 
2e890 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
2e8a0 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69  o.  ** outstandi
2e8b0 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69  ng pages. This i
2e8c0 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20  mplies that the 
2e8d0 70 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75  pager state shou
2e8e0 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62  ld either.  ** b
2e8f0 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52  e OPEN or READER
2e900 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79  . READER is only
2e910 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65   possible if the
2e920 20 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73   pager is or was
2e930 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73   in .  ** exclus
2e940 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e  ive access mode.
2e950 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2e960 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
2e970 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
2e980 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61  Cache)==0 );.  a
2e990 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
2e9a0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
2e9b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2e9c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2e9d0 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61  AGER_OPEN || pPa
2e9e0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2e9f0 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69  ER_READER );.  i
2ea00 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26  f( NEVER(MEMDB &
2ea10 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
2ea20 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61  e) ){ return pPa
2ea30 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a  ger->errCode; }.
2ea40 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
2ea50 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
2ea60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2ea70 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
2ea80 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   int bHotJournal
2ea90 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f   = 1;          /
2eaa0 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
2eab0 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75  exists a hot jou
2eac0 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal-file */..  
2ead0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
2eae0 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61   );..    rc = pa
2eaf0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
2eb00 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2eb10 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
2eb20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2eb30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2eb40 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
2eb50 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
2eb60 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock==UNKNOWN_L
2eb70 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  OCK );.      got
2eb80 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
2eb90 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
2eba0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2ebb0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
2ebc0 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
2ebd0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
2ebe0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
2ebf0 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
2ec00 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
2ec10 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
2ec20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2ec30 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48  Pager->eLock<=SH
2ec40 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
2ec50 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
2ec60 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62  urnal(pPager, &b
2ec70 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  HotJournal);.   
2ec80 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2ec90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eca0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
2ecb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f     }.    if( bHo
2ecc0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
2ecd0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
2ece0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
2ecf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ed00 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
2ed10 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
2ed20 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
2ed30 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
2ed40 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
2ed50 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
2ed60 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
2ed70 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
2ed80 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
2ed90 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
2eda0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
2edb0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
2edc0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
2edd0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
2ede0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
2edf0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2ee00 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
2ee10 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
2ee20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
2ee30 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
2ee40 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
2ee50 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
2ee60 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
2ee70 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
2ee80 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
2ee90 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
2eea0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
2eeb0 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
2eec0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
2eed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
2eee0 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
2eef0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
2ef00 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
2ef10 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
2ef20 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
2ef30 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
2ef40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2ef50 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
2ef60 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74       ** Unless t
2ef70 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c  he pager is in l
2ef80 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2ef90 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
2efa0 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a  lock is.      **
2efb0 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53   downgraded to S
2efc0 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72  HARED_LOCK befor
2efd0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
2efe0 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a  returns..      *
2eff0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
2f000 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
2f010 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
2f020 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2f030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f040 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
2f050 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
2f060 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    /* If it is no
2f070 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61  t already open a
2f080 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  nd the file exis
2f090 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e  ts on disk, open
2f0a0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a   the .      ** j
2f0b0 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
2f0c0 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72  write access. Wr
2f0d0 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65  ite access is re
2f0e0 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a  quired because .
2f0f0 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c        ** in excl
2f100 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
2f110 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
2f120 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
2f130 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a  pt open .      *
2f140 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75  * and possibly u
2f150 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
2f160 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
2f170 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65  Also, write-acce
2f180 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ss .      ** is 
2f190 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  usually required
2f1a0 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2f1b0 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72   journal in jour
2f1c0 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74  nal_mode=persist
2f1d0 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20   .      ** mode 
2f1e0 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f  (and also for jo
2f1f0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63  urnal_mode=trunc
2f200 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  ate on some syst
2f210 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ems)..      **. 
2f220 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a       ** If the j
2f230 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
2f240 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
2f250 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
2f260 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  e .      ** othe
2f270 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  r connection man
2f280 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61  aged to get in a
2f290 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  nd roll it back 
2f2a0 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  before .      **
2f2b0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
2f2c0 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
2f2d0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
2f2e0 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
2f2f0 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
2f300 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
2f310 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
2f320 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
2f330 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
2f340 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
2f350 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f360 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
2f370 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2f380 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2f390 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
2f3a0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
2f3b0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2f3c0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
2f3d0 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b      int bExists;
2f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f3f0 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
2f400 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
2f410 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f420 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
2f430 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
2f440 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2f450 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
2f460 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73  EXISTS, &bExists
2f470 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2f480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2f490 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  bExists ){.     
2f4a0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
2f4b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
2f4c0 20 66 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45   f = .#if SQLITE
2f4d0 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
2f4e0 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20  TECTION.        
2f4f0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73      (pPager->vfs
2f500 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
2f510 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e  N_FILEPROTECTION
2f520 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20  _MASK)|.#endif. 
2f530 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2f540 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2f550 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2f560 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
2f570 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
2f580 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2f590 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2f5a0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2f5b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2f5c0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
2f5d0 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
2f5e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2f5f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2f600 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
2f610 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
2f620 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2f630 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
2f640 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2f650 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
2f660 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
2f670 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
2f680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
2f690 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
2f6a0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
2f6b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f6c0 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c   }. .      /* Pl
2f6d0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
2f6e0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
2f6f0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
2f700 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
2f710 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
2f720 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
2f730 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
2f740 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
2f750 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
2f760 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
2f770 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
2f780 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
2f790 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
2f7a0 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
2f7b0 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
2f7c0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
2f7d0 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
2f7e0 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
2f7f0 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
2f800 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
2f810 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
2f820 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
2f830 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
2f840 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
2f850 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
2f860 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
2f870 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
2f880 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
2f890 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2f8a0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2f8b0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  fd) ){.        a
2f8c0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2f8d0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
2f8e0 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
2f8f0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
2f900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f910 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2f920 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
2f930 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2f940 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
2f950 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
2f960 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
2f970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f980 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
2f990 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2f9a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
2f9b0 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
2f9c0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
2f9d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2f9e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2fa00 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
2fa10 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ken if an error 
2fa20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2fa30 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20  ing to open.    
2fa40 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62      ** or roll b
2fa50 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
2fa60 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  l while holding 
2fa70 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2fa80 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  k. The.        *
2fa90 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
2faa0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
2fab0 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
2fac0 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f  eturning to unlo
2fad0 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ck.        ** th
2fae0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75  e file. If the u
2faf0 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61  nlock attempt fa
2fb00 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ils, then Pager.
2fb10 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20  eLock must be.  
2fb20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
2fb30 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65  UNKNOWN_LOCK (se
2fb40 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
2fb50 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
2fb60 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
2fb70 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f  UNKNOWN_LOCK abo
2fb80 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  ve for an explan
2fb90 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20  ation). .       
2fba0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
2fbb0 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70  n order to get p
2fbc0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f  ager_unlock() to
2fbd0 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61   do this, set Pa
2fbe0 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20  ger.eState to.  
2fbf0 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
2fc00 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69  RROR now. This i
2fc10 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
2fc20 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e  ounted as a tran
2fc30 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  sition.        *
2fc40 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  * to ERROR state
2fc50 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69   in the state di
2fc60 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70  agram at the top
2fc70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20   of this file,. 
2fc80 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
2fc90 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
2fca0 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61   same call to pa
2fcb0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
2fcc0 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a  l very.        *
2fcd0 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69  * shortly transi
2fce0 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f  tion the pager o
2fcf0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45  bject to the OPE
2fd00 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67  N state. Calling
2fd10 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65  .        ** asse
2fd20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
2fd30 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c   would fail now,
2fd40 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f   as it should no
2fd50 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20  t be possible.  
2fd60 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
2fd70 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
2fd80 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  en there are zer
2fd90 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
2fda0 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ge .        ** r
2fdb0 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20  eferences..     
2fdc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61     */.        pa
2fdd0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
2fde0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
2fdf0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
2fe00 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
2fe10 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
2fe20 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
2fe30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2fe40 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53  pPager->eLock==S
2fe50 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
2fe60 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
2fe70 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2fe80 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
2fe90 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  k>SHARED_LOCK). 
2fea0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
2feb0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2fec0 74 65 6d 70 46 69 6c 65 20 0a 20 20 20 20 20 26  tempFile .     &
2fed0 26 20 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  & (pPager->pBack
2fee0 75 70 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61  up || sqlite3Pca
2fef0 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
2ff00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 29  ger->pPCache)>0)
2ff10 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f   .    ){.      /
2ff20 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
2ff30 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
2ff40 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
2ff50 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
2ff60 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
2ff70 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
2ff80 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
2ff90 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
2ffa0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
2ffb0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
2ffc0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
2ffd0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
2ffe0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
2fff0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
30000 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
30010 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
30020 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
30030 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
30040 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
30050 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
30060 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
30070 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
30080 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
30090 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
300a0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
300b0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
300c0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
300d0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
300e0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
300f0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
30100 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
30110 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
30120 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
30130 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
30140 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
30150 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
30160 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
30170 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
30180 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
30190 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
301a0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
301b0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
301c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
301d0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
301e0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
301f0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
30200 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
30210 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
30220 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
30230 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  /.      Pgno nPa
30240 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  ge = 0;.      ch
30250 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
30260 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
30270 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20  ileVers)];..    
30280 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
30290 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
302a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
302b0 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c 65   rc ) goto faile
302c0 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50  d;..      if( nP
302d0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  age>0 ){.       
302e0 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
302f0 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
30300 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
30310 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
30320 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30330 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
30340 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
30350 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
30360 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
30370 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30380 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
30390 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
303a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
303b0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
303c0 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
303d0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
303e0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
303f0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
30400 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
30410 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
30420 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
30430 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
30440 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
30450 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
30460 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
30470 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
30480 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
30490 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
304a0 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
304b0 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
304c0 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
304d0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
304e0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
304f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
30500 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
30510 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
30520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30530 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
30540 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
30550 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
30560 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
30570 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
30580 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
30590 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
305a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
305b0 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
305c0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
305d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
305e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
305f0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
30600 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
30610 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
30620 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
30630 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53  er, &pPager->dbS
30640 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ize);.  }.. fail
30650 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
30660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
30670 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
30680 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
30690 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  k(pPager);.    a
306a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
306b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
306c0 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  N );.  }else{.  
306d0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
306e0 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b   = PAGER_READER;
306f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
30700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
30710 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
30720 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
30730 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79  ro, rollback any
30740 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73   active.** trans
30750 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63  action and unloc
30760 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a  k the pager..**.
30770 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f  ** Except, in lo
30780 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55  cking_mode=EXCLU
30790 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20  SIVE when there 
307a0 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e  is nothing to in
307b0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
307c0 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e   journal, the un
307d0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66  lock is not perf
307e0 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20  ormed and there 
307f0 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f  is.** nothing to
30800 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68   rollback, so th
30810 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
30820 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69  no-op..*/ .stati
30830 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
30840 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72  ckIfUnused(Pager
30850 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
30860 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
30870 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
30880 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a  pPCache)==0) ){.
30890 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
308a0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
308b0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
308c0 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
308d0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
308e0 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
308f0 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
30900 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
30910 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
30920 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
30930 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
30940 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
30950 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
30960 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
30970 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
30980 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
30990 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
309a0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
309b0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
309c0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
309d0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
309e0 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
309f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
30a00 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
30a10 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
30a20 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
30a30 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
30a40 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
30a50 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
30a60 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
30a70 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
30a80 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
30a90 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
30aa0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
30ab0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
30ac0 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
30ad0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
30ae0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
30af0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
30b00 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
30b10 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
30b20 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
30b30 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
30b40 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
30b50 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
30b60 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
30b70 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
30b80 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30b90 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
30ba0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
30bb0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
30bc0 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
30bd0 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
30be0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
30bf0 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
30c00 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
30c10 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
30c20 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
30c30 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
30c40 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
30c50 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
30c60 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
30c70 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
30c80 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
30c90 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
30ca0 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
30cb0 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
30cc0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
30cd0 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
30ce0 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
30cf0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
30d00 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
30d10 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
30d20 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
30d30 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
30d40 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
30d50 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
30d60 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
30d70 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70  ccurs in two sep
30d80 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a  erate scenarios:
30d90 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
30da0 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
30db0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
30dc0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
30dd0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
30de0 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
30df0 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
30e00 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
30e10 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
30e20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
30e30 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
30e40 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
30e50 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
30e60 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
30e70 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
30e80 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
30e90 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
30ea0 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
30eb0 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
30ec0 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
30ed0 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
30ee0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
30ef0 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
30f00 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
30f10 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
30f20 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
30f30 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
30f40 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
30f50 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
30f60 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
30f70 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
30f80 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
30f90 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
30fa0 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
30fb0 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
30fc0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
30fd0 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
30fe0 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
30ff0 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
31000 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
31010 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
31020 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
31030 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
31040 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
31050 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
31060 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
31070 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
31080 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
31090 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
310a0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
310b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
310c0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
310d0 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
310e0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
310f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
31100 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
31110 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
31120 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
31130 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
31140 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
31150 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
31160 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
31170 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
31180 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
31190 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
311a0 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
311b0 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
311c0 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
311d0 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
311e0 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
311f0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
31200 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
31210 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
31220 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
31230 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
31240 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
31250 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
31260 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
31270 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
31280 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
31290 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
312a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
312b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
312c0 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
312d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
312e0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
312f0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
31300 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
31310 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
31320 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
31330 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
31340 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
31350 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
31360 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
31370 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
31380 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
31390 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
313a0 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
313b0 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
313c0 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
313d0 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
313e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
313f0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
31400 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
31410 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
31420 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
31430 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d   );..  if( pgno=
31440 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
31450 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31460 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
31470 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
31480 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
31490 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  te, return an er
314a0 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ror immediately.
314b0 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
314c0 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61  , request the pa
314d0 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63  ge from the PCac
314e0 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69  he layer. */.  i
314f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
31500 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de!=SQLITE_OK ){
31510 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
31520 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
31530 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
31540 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
31550 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
31560 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65   pgno, 1, ppPage
31570 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
31580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31590 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
315a0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
315b0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
315c0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
315d0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
315e0 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
315f0 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
31600 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
31610 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
31620 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
31630 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
31640 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
31650 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
31660 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
31670 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
31680 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
31690 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
316a0 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
316b0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
316c0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
316d0 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70   || (*ppPage)->p
316e0 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
316f0 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  f( (*ppPage)->pP
31700 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
31710 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
31720 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
31730 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
31740 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
31750 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
31760 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
31770 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
31780 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
31790 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
317a0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
317b0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
317c0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
317d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69  .    pPager->nHi
317e0 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
317f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65  SQLITE_OK;..  }e
31800 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
31810 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20  pager cache has 
31820 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61  created a new pa
31830 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20  ge. Its content 
31840 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a  needs to .    **
31850 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
31860 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20    */..    pPg = 
31870 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50 67  *ppPage;.    pPg
31880 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
31890 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  r;..    /* The m
318a0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
318b0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
318c0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
318d0 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20 20  T if a page.    
318e0 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
318f0 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
31900 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69  the unused locki
31910 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71 75  ng-page, is requ
31920 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  ested. */.    if
31930 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
31940 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50  _PGNO || pgno==P
31950 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
31960 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
31970 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31980 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
31990 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
319a0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
319b0 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50   if( MEMDB || pP
319c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e  ager->dbSize<pgn
319d0 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c  o || noContent |
319e0 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
319f0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
31a00 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
31a10 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
31a20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
31a30 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  LL;.        goto
31a40 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
31a50 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
31a60 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
31a70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
31a80 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
31a90 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
31aa0 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
31ab0 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
31ac0 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
31ad0 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
31ae0 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
31af0 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
31b00 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
31b10 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
31b20 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
31b30 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
31b40 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
31b50 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
31b60 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
31b70 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
31b80 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
31b90 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
31ba0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
31bb0 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
31bc0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
31bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
31be0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
31bf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
31c00 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
31c10 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
31c20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
31c30 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76   = ) sqlite3Bitv
31c40 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
31c50 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
31c60 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
31c70 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
31c80 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
31c90 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f   }.        TESTO
31ca0 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
31cb0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
31cc0 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  s(pPager, pgno);
31cd0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
31ce0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
31cf0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  MEM );.        s
31d00 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
31d10 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d  alloc();.      }
31d20 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
31d30 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
31d40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
31d50 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
31d60 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
31d70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
31d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31d90 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
31da0 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
31db0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69       pPager->nMi
31dc0 73 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d  ss++;.      rc =
31dd0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
31de0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
31df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31e00 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
31e10 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
31e20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
31e30 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
31e40 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
31e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
31e60 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
31e70 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
31e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
31e90 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
31ea0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
31eb0 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
31ec0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
31ed0 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
31ee0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
31ef0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
31f00 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
31f10 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
31f20 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
31f30 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
31f40 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
31f50 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
31f60 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
31f70 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
31f80 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
31f90 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
31fa0 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
31fb0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
31fc0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
31fd0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
31fe0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
31ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
32000 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
32010 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
32020 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
32030 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
32040 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
32050 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
32060 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
32070 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
32080 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
32090 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
320a0 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
320b0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
320c0 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
320d0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
320e0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
320f0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
32100 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
32110 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
32120 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
32130 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
32140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32150 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
32160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
32170 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
32180 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
32190 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
321a0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c  R_ERROR );.  sql
321b0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
321c0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
321d0 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
321e0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
321f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
32200 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
32210 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
32220 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
32230 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
32240 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
32250 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
32260 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
32270 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
32280 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
32290 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
322a0 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
322b0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
322c0 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
322d0 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
322e0 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
322f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
32300 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
32310 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
32320 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
32330 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
32340 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
32350 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
32360 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
32370 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
32380 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
32390 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
323a0 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
323b0 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
323c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
323d0 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
323e0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
323f0 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
32400 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32410 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
32420 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
32430 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
32440 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
32450 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
32460 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
32470 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
32480 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
32490 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
324a0 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
324b0 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
324c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
324d0 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
324e0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
324f0 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
32500 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
32510 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
32520 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
32530 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
32540 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
32550 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
32560 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
32570 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
32580 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
32590 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
325a0 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
325b0 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
325c0 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
325d0 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
325e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
325f0 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
32600 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
32610 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
32620 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
32630 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
32640 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
32650 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
32660 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
32670 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
32680 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
32690 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
326a0 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
326b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
326c0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
326d0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
326e0 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
326f0 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
32700 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
32710 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
32720 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
32730 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
32740 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
32750 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
32760 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
32770 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
32780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
32790 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
327a0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
327b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
327c0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
327d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
327e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
327f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
32800 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
32810 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
32820 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
32830 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
32840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
32850 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
32860 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
32870 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
32880 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
32890 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
328a0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
328b0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
328c0 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
328d0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
328e0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
328f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
32900 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
32910 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
32920 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
32930 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
32940 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
32950 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
32960 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
32970 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
32980 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
32990 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66  ->errCode;..  if
329a0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
329b0 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72  Pager) && pPager
329c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
329d0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
329e0 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67  _OFF ){.    pPag
329f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
32a00 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
32a10 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
32a20 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
32a30 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
32a40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
32a50 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
32a60 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
32a70 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
32a80 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
32a90 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
32aa0 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69  n. */.    if( !i
32ab0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32ac0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
32ad0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
32ae0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32af0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
32b00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
32b10 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
32b20 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
32b30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32b40 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
32b50 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  s =             
32b60 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
32b70 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e  gs to open journ
32b80 61 6c 20 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53  al file */.#if S
32b90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
32ba0 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
32bb0 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
32bc0 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
32bd0 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
32be0 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
32bf0 66 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  f.          SQLI
32c00 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
32c10 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
32c20 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
32c30 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
32c40 65 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  e ? .           
32c50 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   (SQLITE_OPEN_DE
32c60 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49  LETEONCLOSE|SQLI
32c70 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
32c80 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20  RNAL):.         
32c90 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
32ca0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
32cb0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66          );.  #if
32cc0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
32cd0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
32ce0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32cf0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
32d00 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
32d10 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
32d20 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
32d30 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
32d40 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
32d50 20 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73         );.  #els
32d60 65 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  e.        rc = s
32d70 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
32d80 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32d90 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
32da0 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23  , flags, 0);.  #
32db0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
32dc0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
32dd0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
32de0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
32df0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a   );.    }.  .  .
32e00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
32e10 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
32e20 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75  eader to the jou
32e30 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70  rnal file and op
32e40 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
32e50 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ub-journal if ne
32e60 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
32e70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32e80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
32e90 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
32ea0 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
32eb0 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
32ec0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67  d. */.      pPag
32ed0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
32ee0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
32ef0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
32f00 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
32f10 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
32f20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
32f30 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  r = 0;.      rc 
32f40 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
32f50 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  r(pPager);.    }
32f60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
32f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32f80 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
32f90 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
32fa0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
32fb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
32fc0 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  l = 0;.  }else{.
32fd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
32fe0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
32ff0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
33000 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
33010 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
33020 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20  ITER_CACHEMOD;. 
33030 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
33040 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
33050 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
33060 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69  ion on the speci
33070 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63  fied pager objec
33080 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74  t. If a .** writ
33090 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e-transaction ha
330a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  s already been o
330b0 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  pened, this func
330c0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
330d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78  .**.** If the ex
330e0 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73  Flag argument is
330f0 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71   false, then acq
33100 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20  uire at least a 
33110 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
33120 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
33130 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67   file. If exFlag
33140 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
33150 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a  cquire at least.
33160 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ** an EXCLUSIVE 
33170 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20  lock. If such a 
33180 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
33190 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67  held, no locking
331a0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e   .** functions n
331b0 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a  eed be called..*
331c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a  *.** If the subj
331d0 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
331e0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
331f0 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72  hen any sub-jour
33200 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69  nal opened.** wi
33210 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
33220 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70  ction will be op
33230 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65  ened as an in-me
33240 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a  mory file. This.
33250 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ** has no effect
33260 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   if the sub-jour
33270 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f  nal is already o
33280 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79  pened (as it may
33290 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e   be when.** runn
332a0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
332b0 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65   mode) or if the
332c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65   transaction doe
332d0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a  s not require a.
332e0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  ** sub-journal. 
332f0 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
33300 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
33310 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72  zero, then any r
33320 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a  equired.** sub-j
33330 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d  ournal is implem
33340 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  ented in-memory 
33350 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20  if pPager is an 
33360 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
33370 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67  se, .** or using
33380 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
33390 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
333a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
333b0 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
333c0 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c  ger, int exFlag,
333d0 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72   int subjInMemor
333e0 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  y){.  int rc = S
333f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
33400 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
33410 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
33420 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73  ->errCode;.  ass
33430 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33440 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
33450 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74  R && pPager->eSt
33460 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20  ate<PAGER_ERROR 
33470 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62  );.  pPager->sub
33480 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29  jInMemory = (u8)
33490 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20  subjInMemory;.. 
334a0 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67   if( ALWAYS(pPag
334b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
334c0 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20  R_READER) ){.   
334d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
334e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
334f0 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  ;..    if( pager
33500 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33510 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
33520 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69  e pager is confi
33530 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63  gured to use loc
33540 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
33550 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20  ive, and an.    
33560 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c    ** exclusive l
33570 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
33580 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ase is not alrea
33590 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20  dy held, obtain 
335a0 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f  it now..      */
335b0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
335c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
335d0 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78   && sqlite3WalEx
335e0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
335f0 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b  er->pWal, -1) ){
33600 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
33610 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
33620 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
33630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
33640 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33650 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
33660 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
33670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
33680 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
33690 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b  Pager->pWal, 1);
336a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
336b0 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74  /* Grab the writ
336c0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f  e lock on the lo
336d0 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65  g file. If succe
336e0 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74  ssful, upgrade t
336f0 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52  o.      ** PAGER
33700 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
33710 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
33720 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
33730 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
33740 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73        ** The bus
33750 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74  y-handler is not
33760 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74   invoked if anot
33770 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  her connection a
33780 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20  lready.      ** 
33790 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d  holds the write-
337a0 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c  lock. If possibl
337b0 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  e, the upper lay
337c0 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e  er will call it.
337d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
337e0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
337f0 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
33800 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61  tion(pPager->pWa
33810 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
33820 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61       /* Obtain a
33830 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
33840 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
33850 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c  ile. If the exFl
33860 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  ag parameter.   
33870 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74     ** is true, t
33880 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  hen immediately 
33890 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20  upgrade this to 
338a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
338b0 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  k. The.      ** 
338c0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
338d0 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
338e0 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
338f0 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
33900 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c  E.      ** lock,
33910 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62   but not when ob
33920 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45  taining the RESE
33930 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  RVED lock..     
33940 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
33950 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
33960 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
33970 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
33980 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
33990 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
339a0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
339b0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
339c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
339d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
339e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
339f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
33a00 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54  * Change to WRIT
33a10 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e  ER_LOCKED state.
33a20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
33a30 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73  ** WAL mode sets
33a40 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f   Pager.eState to
33a50 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
33a60 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44  CKED or CACHEMOD
33a70 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69  .      ** when i
33a80 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72  t has an open tr
33a90 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e  ansaction, but n
33aa0 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72  ever to DBMOD or
33ab0 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20   FINISHED..     
33ac0 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61   ** This is beca
33ad0 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61  use in those sta
33ae0 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
33af0 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f  roll back savepo
33b00 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
33b10 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63  ansactions may c
33b20 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
33b30 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e  e sub-journal in
33b40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
33b50 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
33b60 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74  s well as into t
33b70 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57  he page cache. W
33b80 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e  hich would be in
33b90 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20  correct in .    
33ba0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20    ** WAL mode.. 
33bb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
33bc0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
33bd0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
33be0 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ED;.      pPager
33bf0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
33c00 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
33c10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
33c20 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ileSize = pPager
33c30 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
33c40 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
33c50 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
33c60 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ize;.      pPage
33c70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
33c80 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  0;.    }..    as
33c90 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
33ca0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
33cb0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
33cc0 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72  DER );.    asser
33cd0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33ce0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
33cf0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
33d00 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61  _LOCKED );.    a
33d10 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
33d20 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
33d30 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  ) );.  }..  PAGE
33d40 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
33d50 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
33d60 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
33d70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33d80 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
33d90 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
33da0 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
33db0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
33dc0 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
33dd0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
33de0 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
33df0 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
33e00 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
33e10 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
33e20 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
33e30 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
33e40 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
33e50 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
33e60 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
33e70 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
33e80 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
33e90 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
33ea0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
33eb0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
33ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
33ed0 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
33ee0 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
33ef0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
33f00 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
33f10 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
33f20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33f30 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
33f40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
33f50 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
33f60 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
33f70 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a  on has already .
33f80 20 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65    ** been starte
33f90 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d. The journal f
33fa0 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ile may or may n
33fb0 6f 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68  ot be open at th
33fc0 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49  is point..  ** I
33fd0 74 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  t is never calle
33fe0 64 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  d in the ERROR s
33ff0 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tate..  */.  ass
34000 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
34010 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
34020 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
34030 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
34040 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
34050 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
34060 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
34070 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
34080 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73  DBMOD.  );.  ass
34090 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
340a0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
340b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  );..  /* If an e
340c0 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
340d0 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65  eviously detecte
340e0 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61  d, report the sa
340f0 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67  me error.  ** ag
34100 61 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ain. This should
34110 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74   not happen, but
34120 20 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69   the check provi
34130 64 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20  des robustness. 
34140 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
34150 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
34160 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  )  return pPager
34170 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
34180 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   Higher-level ro
34190 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c  utines never cal
341a0 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
341b0 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  if database is n
341c0 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65  ot.  ** writable
341d0 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79  .  But check any
341e0 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f  way, just for ro
341f0 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
34200 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
34210 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74  >readOnly) ) ret
34220 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
34230 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
34240 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  Pg);..  /* The j
34250 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
34260 73 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20  s to be opened. 
34270 48 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75  Higher level rou
34280 74 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61  tines have alrea
34290 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  dy.  ** obtained
342a0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
342b0 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68  ocks to begin th
342c0 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
342d0 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a  ion, but the.  *
342e0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
342f0 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74  al might not yet
34300 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69   be open. Open i
34310 74 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73  t now if this is
34320 20 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a   the case..  **.
34330 20 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e    ** This is don
34340 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
34350 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
34360 6b 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65  keDirty() on the
34370 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68   page. .  ** Oth
34380 65 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65  erwise, if it we
34390 72 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61  re done after ca
343a0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  lling sqlite3Pca
343b0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20  cheMakeDirty(), 
343c0 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  then.  ** an err
343d0 6f 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61  or might occur a
343e0 6e 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75  nd the pager wou
343f0 6c 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49  ld end up in WRI
34400 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
34410 0a 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73  .  ** with pages
34420 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
34430 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20   in the cache.. 
34440 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
34450 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
34460 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b  WRITER_LOCKED ){
34470 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
34480 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
34490 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
344a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
344b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
344c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
344d0 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
344e0 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a  TER_CACHEMOD );.
344f0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
34500 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
34510 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ger) );..  /* Ma
34520 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64  rk the page as d
34530 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61  irty.  If the pa
34540 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ge has already b
34550 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a  een written.  **
34560 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
34570 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75  then we can retu
34580 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  rn right away.. 
34590 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
345a0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
345b0 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a  );.  if( pageInJ
345c0 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21  ournal(pPg) && !
345d0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
345e0 28 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73  (pPg) ){.    ass
345f0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
34600 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d  l(pPager) );.  }
34610 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20  else{.  .    /* 
34620 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
34630 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
34640 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
34650 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
34660 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
34670 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
34680 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
34690 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
346a0 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
346b0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
346c0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
346d0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
346e0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
346f0 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
34700 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70 61  rnal(pPg) && !pa
34710 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34720 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
34730 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
34740 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20  Pager)==0 );.   
34750 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
34760 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
34770 53 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70  Size && isOpen(p
34780 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
34790 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
347a0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
347b0 70 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20  pData2;.        
347c0 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65  i64 iOff = pPage
347d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
347e0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
347f0 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
34800 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
34810 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
34820 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
34830 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
34840 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
34850 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
34860 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
34870 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
34880 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
34890 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
348a0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
348b0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
348c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
348d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
348e0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
348f0 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43  Off );.        C
34900 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
34910 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
34920 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  7, return SQLITE
34930 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b  _NOMEM, pData2);
34940 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d  .        cksum =
34950 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
34960 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
34970 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
34980 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
34990 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
349a0 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72  ccurs while jour
349b0 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
349c0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
349d0 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
349e0 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
349f0 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
34a00 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
34a10 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
34a20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
34a30 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
34a40 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
34a50 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
34a60 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
34a70 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
34a80 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
34a90 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
34aa0 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
34ab0 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
34ac0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
34ad0 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
34ae0 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
34af0 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
34b00 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
34b10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
34b20 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
34b30 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20  DR_NEED_SYNC;.. 
34b40 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
34b50 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
34b60 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e  jfd, iOff, pPg->
34b70 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
34b80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34b90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
34ba0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34bb0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
34bc0 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
34bd0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
34be0 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20   iOff+4);.      
34bf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34c00 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
34c10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
34c20 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
34c30 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67  ->jfd, iOff+pPag
34c40 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
34c50 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
34c60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
34c70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
34c80 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
34c90 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
34ca0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
34cb0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
34cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
34cd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
34ce0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
34cf0 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
34d00 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
34d10 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
34d20 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
34d30 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e  GERTRACE(("JOURN
34d40 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
34d50 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
34d60 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
34d70 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
34d80 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
34d90 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
34da0 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
34db0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
34dc0 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
34dd0 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20  sh(pPg)));..    
34de0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
34df0 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50  nalOff += 8 + pP
34e00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
34e10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
34e20 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
34e30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
34e40 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
34e50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34e60 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
34e70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
34e80 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
34e90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
34ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34eb0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  M );.        ass
34ec0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34ed0 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
34ee0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
34ef0 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
34f00 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
34f10 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
34f20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34f30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34f40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34f50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
34f60 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  M );.          r
34f70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34f80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
34f90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
34fa0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
34fb0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
34fc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
34fd0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
34fe0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
34ff0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
35000 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
35010 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
35020 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
35030 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
35040 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
35050 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
35060 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
35070 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
35080 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
35090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
350a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
350b0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
350c0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
350d0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
350e0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
350f0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
35100 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
35110 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
35120 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
35130 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
35140 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
35150 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
35160 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
35170 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
35180 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
35190 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
351a0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
351b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
351c0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
351d0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
351e0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
351f0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
35200 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
35210 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
35220 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
35230 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
35240 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
35250 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
35260 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
35270 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
35280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
35290 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
352a0 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
352b0 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
352c0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
352d0 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
352e0 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
352f0 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
35300 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
35310 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
35320 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
35330 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
35340 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
35350 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
35360 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
35370 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
35380 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
35390 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
353a0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
353b0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
353c0 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
353d0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
353e0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
353f0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
35400 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
35410 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
35420 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
35430 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
35440 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
35450 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
35460 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
35470 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
35480 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
35490 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
354a0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
354b0 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
354c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
354d0 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
354e0 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
354f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
35500 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
35510 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
35520 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
35530 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
35540 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
35550 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
35560 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
35570 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
35580 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
35590 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
355a0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
355b0 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ze);..  assert( 
355c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
355d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
355e0 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
355f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
35600 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
35610 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
35620 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
35630 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e  ger) );..  if( n
35640 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
35650 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
35660 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
35670 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
35680 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
35690 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
356a0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
356b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
356c0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
356d0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
356e0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
356f0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b    int nPage = 0;
35700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35710 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
35720 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
35730 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
35740 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
35750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
35760 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
35770 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
35780 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
35790 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
357a0 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
357b0 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  YNC */..    /* S
357c0 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
357d0 53 70 69 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e  Spill flag to 1.
357e0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
357f0 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
35800 0a 20 20 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  .    ** a journa
35810 6c 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  l header to be w
35820 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
35830 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
35840 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 69  ed by.    ** thi
35850 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
35860 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
35870 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
35880 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
35890 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29  otSyncSpill==0 )
358a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
358b0 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a  NotSyncSpill++;.
358c0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
358d0 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
358e0 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
358f0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
35900 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
35910 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
35920 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
35930 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
35940 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
35950 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
35960 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
35970 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
35980 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
35990 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
359a0 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
359b0 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
359c0 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e  ;..    nPageCoun
359d0 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  t = pPager->dbSi
359e0 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  ze;.    if( pPg-
359f0 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
35a00 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
35a10 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
35a20 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
35a30 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
35a40 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
35a50 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
35a60 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
35a70 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
35a80 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
35a90 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
35aa0 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
35ab0 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
35ac0 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
35ad0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
35ae0 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
35af0 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
35b00 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
35b10 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
35b20 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
35b30 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
35b40 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
35b50 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
35b60 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
35b70 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
35b80 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
35b90 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
35ba0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
35bb0 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
35bc0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35bd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35be0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
35bf0 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
35c00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
35c10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35c20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
35c30 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
35c40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
35c50 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
35c60 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
35c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35c80 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
35c90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
35ca0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
35cb0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
35cc0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
35cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35ce0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
35cf0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
35d00 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
35d10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
35d20 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
35d30 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
35d40 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
35d50 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
35d60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35d70 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
35d80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35d90 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
35da0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
35db0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
35dc0 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
35dd0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
35de0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
35df0 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
35e00 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
35e10 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
35e20 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
35e30 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
35e40 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
35e50 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
35e60 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
35e70 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
35e80 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
35e90 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
35ea0 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
35eb0 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
35ec0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
35ed0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
35ee0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
35ef0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35f00 49 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79  ITE_OK && needSy
35f10 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  nc ){.      asse
35f20 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
35f30 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
35f40 3c 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  <nPage; ii++){. 
35f50 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
35f60 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
35f70 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
35f80 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
35f90 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
35fa0 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
35fb0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
35fc0 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
35fd0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
35fe0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
35ff0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
36000 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36010 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70  ger->doNotSyncSp
36020 69 6c 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50  ill==1 );.    pP
36030 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
36040 70 69 6c 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  pill--;.  }else{
36050 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
36060 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
36070 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
36080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
36090 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
360a0 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
360b0 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
360c0 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
360d0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
360e0 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
360f0 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
36100 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
36110 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
36120 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
36130 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
36140 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
36150 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36160 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
36170 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
36180 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
36190 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  RTY;.}.#endif../
361a0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
361b0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
361c0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
361d0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
361e0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
361f0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
36200 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
36210 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
36220 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
36230 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
36240 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
36250 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
36260 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
36270 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68  en.** the page h
36280 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73  as been added as
36290 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66   a leaf of the f
362a0 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69  reelist and so i
362b0 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f  ts.** content no
362c0 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e   longer matters.
362d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
362e0 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
362f0 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
36300 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
36310 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
36320 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
36330 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20   is unused. The 
36340 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
36350 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
36360 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
36370 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
36380 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
36390 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
363a0 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
363b0 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20  n can quadruple 
363c0 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
363d0 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70  ge .** DELETE op
363e0 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69  erations..*/.voi
363f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
36400 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70  ntWrite(PgHdr *p
36410 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36420 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
36430 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  er;.  if( (pPg->
36440 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
36450 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  Y) && pPager->nS
36460 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20  avepoint==0 ){. 
36470 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
36480 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
36490 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
364a0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
364b0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49  pPager)));.    I
364c0 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
364d0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
364e0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
364f0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
36500 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
36510 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
36520 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20  agehash(pPg);.  
36530 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
36540 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
36550 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
36560 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
36570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a  database file .*
36580 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  * change-counter
36590 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d  , stored as a 4-
365a0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
365b0 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67  integer starting
365c0 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66   at .** byte off
365d0 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61  set 24 of the pa
365e0 67 65 72 20 66 69 6c 65 2e 20 20 54 68 65 20 73  ger file.  The s
365f0 65 63 6f 6e 64 61 72 79 20 63 68 61 6e 67 65 20  econdary change 
36600 63 6f 75 6e 74 65 72 20 61 74 0a 2a 2a 20 39 32  counter at.** 92
36610 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64   is also updated
36620 2c 20 61 73 20 69 73 20 74 68 65 20 53 51 4c 69  , as is the SQLi
36630 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
36640 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
36650 2a 2a 0a 2a 2a 20 42 75 74 20 74 68 69 73 20 6f  **.** But this o
36660 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
36670 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  he pPager->chang
36680 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
36690 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f 20  is false..** To 
366a0 61 76 6f 69 64 20 65 78 63 65 73 73 20 63 68 75  avoid excess chu
366b0 72 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 31 2c  rning of page 1,
366c0 20 74 68 65 20 75 70 64 61 74 65 20 6f 6e 6c 79   the update only
366d0 20 68 61 70 70 65 6e 73 20 6f 6e 63 65 2e 0a 2a   happens once..*
366e0 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70  * See also the p
366f0 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
36700 65 63 6f 75 6e 74 65 72 28 29 20 72 6f 75 74 69  ecounter() routi
36710 6e 65 20 74 68 61 74 20 64 6f 65 73 20 61 6e 20  ne that does an 
36720 0a 2a 2a 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61  .** unconditiona
36730 6c 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  l update of the 
36740 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 73 2e  change counters.
36750 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
36760 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67 20  DirectMode flag 
36770 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
36780 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20 63 61  is is done by ca
36790 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65  lling .** sqlite
367a0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
367b0 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f   page 1, then mo
367c0 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
367d0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70  ents of the.** p
367e0 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74 68 69  age data. In thi
367f0 73 20 63 61 73 65 20 74 68 65 20 66 69 6c 65 20  s case the file 
36800 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20  will be updated 
36810 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
36820 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
36830 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
36840 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65 63 74  .** The isDirect
36850 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20 6f 6e  Mode flag may on
36860 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ly be non-zero i
36870 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  f the library wa
36880 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69  s compiled.** wi
36890 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  th the SQLITE_EN
368a0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
368b0 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  E macro defined.
368c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
368d0 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73  * if isDirect is
368e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
368f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36900 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72  e is updated dir
36910 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74  ectly.** by writ
36920 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76  ing an updated v
36930 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
36940 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
36950 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
36960 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  OsWrite() functi
36970 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
36980 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
36990 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
369a0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
369b0 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69  DirectMode){.  i
369c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
369d0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
369e0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
369f0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
36a00 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
36a10 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36a20 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
36a30 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
36a40 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
36a50 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  te(pPager) );.. 
36a60 20 2f 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20   /* Declare and 
36a70 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74  initialize const
36a80 61 6e 74 20 69 6e 74 65 67 65 72 20 27 69 73 44  ant integer 'isD
36a90 69 72 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20  irect'. If the. 
36aa0 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65   ** atomic-write
36ab0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
36ac0 20 65 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73   enabled in this
36ad0 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44   build, then isD
36ae0 69 72 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e  irect.  ** is in
36af0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65  itialized to the
36b00 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
36b10 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
36b20 65 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  e parameter.  **
36b30 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
36b40 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  n. Otherwise, it
36b50 20 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 74   is always set t
36b60 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  o zero..  **.  *
36b70 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
36b80 61 74 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63  at if the atomic
36b90 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
36ba0 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ion is not.  ** 
36bb0 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
36bc0 6c 65 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d  le time, the com
36bd0 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74  piler can omit t
36be0 68 65 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a  he tests of.  **
36bf0 20 27 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f   'isDirect' belo
36c00 77 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  w, as well as th
36c10 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64  e block enclosed
36c20 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66   in the.  ** "if
36c30 28 20 69 73 44 69 72 65 63 74 20 29 22 20 63 6f  ( isDirect )" co
36c40 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69  ndition..  */.#i
36c50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
36c60 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
36c70 0a 23 20 64 65 66 69 6e 65 20 44 49 52 45 43 54  .# define DIRECT
36c80 5f 4d 4f 44 45 20 30 0a 20 20 61 73 73 65 72 74  _MODE 0.  assert
36c90 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d  ( isDirectMode==
36ca0 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
36cb0 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74  RAMETER(isDirect
36cc0 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 23 20 64  Mode);.#else.# d
36cd0 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
36ce0 45 20 69 73 44 69 72 65 63 74 4d 6f 64 65 0a 23  E isDirectMode.#
36cf0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 21 70 50  endif..  if( !pP
36d00 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
36d10 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d  tDone && pPager-
36d20 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
36d30 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20   PgHdr *pPgHdr; 
36d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36d50 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70  * Reference to p
36d60 61 67 65 20 31 20 2a 2f 0a 0a 20 20 20 20 61 73  age 1 */..    as
36d70 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
36d80 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65  empFile && isOpe
36d90 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
36da0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  ..    /* Open pa
36db0 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
36dc0 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
36dd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
36de0 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
36df0 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
36e00 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64     assert( pPgHd
36e10 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  r==0 || rc==SQLI
36e20 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
36e30 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73   If page one was
36e40 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73   fetched success
36e50 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20  fully, and this 
36e60 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  function is not.
36e70 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
36e80 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c   in direct-mode,
36e90 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69   make page 1 wri
36ea0 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74  table.  When not
36eb0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65   in .    ** dire
36ec0 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20  ct mode, page 1 
36ed0 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69  is always held i
36ee0 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63  n cache and henc
36ef0 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29  e the PagerGet()
36f00 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73  .    ** above is
36f10 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66   always successf
36f20 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41  ul - hence the A
36f30 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c  LWAYS on rc==SQL
36f40 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20  ITE_OK..    */. 
36f50 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d     if( !DIRECT_M
36f60 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63  ODE && ALWAYS(rc
36f70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  ==SQLITE_OK) ){.
36f80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36f90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
36fa0 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hdr);.    }..   
36fb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36fc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  OK ){.      /* A
36fd0 63 74 75 61 6c 6c 79 20 64 6f 20 74 68 65 20 75  ctually do the u
36fe0 70 64 61 74 65 20 6f 66 20 74 68 65 20 63 68 61  pdate of the cha
36ff0 6e 67 65 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge counter */. 
37000 20 20 20 20 20 70 61 67 65 72 5f 77 72 69 74 65       pager_write
37010 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
37020 50 67 48 64 72 29 3b 0a 0a 20 20 20 20 20 20 2f  PgHdr);..      /
37030 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
37040 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
37050 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
37060 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
37070 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
37080 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  if( DIRECT_MODE 
37090 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
370a0 20 76 6f 69 64 20 2a 7a 42 75 66 3b 0a 20 20 20   void *zBuf;.   
370b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
370c0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
370d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  0 );.        COD
370e0 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 48  EC2(pPager, pPgH
370f0 64 72 2d 3e 70 44 61 74 61 2c 20 31 2c 20 36 2c  dr->pData, 1, 6,
37100 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
37110 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  , zBuf);.       
37120 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37130 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
37140 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
37150 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
37160 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
37170 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  geSize, 0);.    
37180 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
37190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
371a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
371b0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
371c0 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
371d0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
371e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
371f0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
37200 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
37210 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
37220 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
37230 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
37240 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
37250 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20  (pPgHdr);.  }.  
37260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
37270 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
37280 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 64 69  abase file to di
37290 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
372a0 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
372b0 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 6f  y databases.** o
372c0 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68 65  r pages with the
372d0 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
372e0 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
372f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
37300 69 66 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  if called on a p
37310 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69  ager for which i
37320 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68  t is a no-op, th
37330 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
37340 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
37350 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
37360 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
37370 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
37380 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
37390 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
373a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
373b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
373c0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
373d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
373e0 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  EMDB );.    rc =
373f0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
37400 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
37410 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
37420 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65   }else if( isOpe
37430 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
37440 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
37450 4d 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  MDB );.    rc = 
37460 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
37470 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
37480 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 59   SQLITE_FCNTL_SY
37490 4e 43 5f 4f 4d 49 54 54 45 44 2c 20 30 29 3b 0a  NC_OMITTED, 0);.
374a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
374b0 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
374c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
374d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
374e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
374f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37500 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
37510 61 6c 6c 65 64 20 77 68 69 6c 65 20 61 20 77 72  alled while a wr
37520 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
37530 69 73 20 61 63 74 69 76 65 20 69 6e 0a 2a 2a 20  is active in.** 
37540 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 74 68 65  rollback. If the
37550 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
37560 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73  n WAL mode, this
37570 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
37580 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
37590 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
375a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  on does not alre
375b0 61 64 79 20 68 61 76 65 20 61 6e 20 45 58 43 4c  ady have an EXCL
375c0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 0a 2a  USIVE lock on .*
375d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
375e0 69 6c 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  ile, an attempt 
375f0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
37600 6e 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n one..**.** If 
37610 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
37620 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
37630 6c 64 20 6f 72 20 74 68 65 20 61 74 74 65 6d 70  ld or the attemp
37640 74 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 20 69  t to obtain it i
37650 73 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 2c  s.** successful,
37660 20 6f 72 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   or the connecti
37670 6f 6e 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64  on is in WAL mod
37680 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
37690 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 4f 74 68  returned..** Oth
376a0 65 72 77 69 73 65 2c 20 65 69 74 68 65 72 20 53  erwise, either S
376b0 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 61 6e  QLITE_BUSY or an
376c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
376d0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
376e0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
376f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
37700 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 50  rExclusiveLock(P
37710 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
37720 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37730 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
37740 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37750 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
37760 45 4d 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20  EMOD .       || 
37770 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37780 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
37790 4f 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  OD .       || pP
377a0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
377b0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
377c0 44 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  D .  );.  assert
377d0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
377e0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
377f0 20 20 69 66 28 20 30 3d 3d 70 61 67 65 72 55 73    if( 0==pagerUs
37800 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
37810 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
37820 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
37830 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
37840 43 4b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  CK);.  }.  retur
37850 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
37860 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
37870 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
37880 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
37890 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
378a0 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
378b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
378c0 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
378d0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
378e0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
378f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
37900 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
37910 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
37920 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
37930 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
37940 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
37950 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
37960 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
37970 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
37980 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
37990 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
379a0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73  hange-counter is
379b0 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a   updated,.**   *
379c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
379d0 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74  synced (unless t
379e0 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
379f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
37a00 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c  used),.**   * al
37a10 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72  l dirty pages ar
37a20 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
37a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
37a40 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
37a50 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75  base file is tru
37a60 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69  ncated (if requi
37a70 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  red), and.**   *
37a80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37a90 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a  le synced. .**.*
37aa0 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  * The only thing
37ab0 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
37ac0 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
37ad0 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69  saction is to fi
37ae0 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65  nalize .** (dele
37af0 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20  te, truncate or 
37b00 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70  zero the first p
37b10 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72  art of) the jour
37b20 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a  nal file (or .**
37b30 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
37b40 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
37b50 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
37b60 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
37b70 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
37b80 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
37b90 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
37ba0 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
37bb0 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
37bc0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
37bd0 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
37be0 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20  ** If the final 
37bf0 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79  parameter - noSy
37c00 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68  nc - is true, th
37c10 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
37c20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69  file itself.** i
37c30 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68  s not synced. Th
37c40 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61  e caller must ca
37c50 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ll sqlite3PagerS
37c60 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74  ync() directly t
37c70 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61  o.** sync the da
37c80 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
37c90 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69  re calling Commi
37ca0 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64  tPhaseTwo() to d
37cb0 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  elete the.** jou
37cc0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69  rnal file in thi
37cd0 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s case..*/.int s
37ce0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
37cf0 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67  tPhaseOne(.  Pag
37d00 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
37d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37d20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
37d30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
37d40 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  aster,          
37d50 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
37d60 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
37d70 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
37d80 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20  nt noSync       
37d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37da0 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74  * True to omit t
37db0 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20  he xSync on the 
37dc0 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  db file */.){.  
37dd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37de0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
37df0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
37e00 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
37e10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37e20 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37e30 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
37e40 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37e50 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
37e60 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
37e70 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37e80 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
37e90 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
37ea0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
37eb0 52 4f 52 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  ROR.  );.  asser
37ec0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
37ed0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
37ee0 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69 6f  ..  /* If a prio
37ef0 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  r error occurred
37f00 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65 72  , report that er
37f10 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ror again. */.  
37f20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
37f30 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
37f40 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
37f50 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  ode;..  PAGERTRA
37f60 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59  CE(("DATABASE SY
37f70 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
37f80 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c  ter=%s nSize=%d\
37f90 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
37fa0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
37fb0 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  aster, pPager->d
37fc0 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  bSize));..  /* I
37fd0 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 63 68  f no database ch
37fe0 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  anges have been 
37ff0 6d 61 64 65 2c 20 72 65 74 75 72 6e 20 65 61 72  made, return ear
38000 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ly. */.  if( pPa
38010 67 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45  ger->eState<PAGE
38020 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
38030 44 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  D ) return SQLIT
38040 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  E_OK;..  if( MEM
38050 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  DB ){.    /* If 
38060 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
38070 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
38080 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
38090 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
380a0 69 73 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74 69  is.    ** functi
380b0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
380c0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
380d0 73 20 6d 6f 73 74 6c 79 20 61 20 6e 6f 2d 6f 70  s mostly a no-op
380e0 2e 20 20 48 6f 77 65 76 65 72 2c 20 61 6e 79 0a  .  However, any.
380f0 20 20 20 20 2a 2a 20 62 61 63 6b 75 70 20 69 6e      ** backup in
38100 20 70 72 6f 67 72 65 73 73 20 6e 65 65 64 73 20   progress needs 
38110 74 6f 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  to be restarted.
38120 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
38130 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
38140 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
38150 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
38160 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
38170 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
38180 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20   PgHdr *pList = 
38190 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
381a0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
381b0 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20 50  PCache);.      P
381c0 67 48 64 72 20 2a 70 50 61 67 65 4f 6e 65 20 3d  gHdr *pPageOne =
381d0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   0;.      if( pL
381e0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
381f0 20 20 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61    /* Must have a
38200 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
38210 20 66 6f 72 20 74 68 65 20 57 41 4c 20 63 6f 6d   for the WAL com
38220 6d 69 74 20 66 6c 61 67 2e 0a 20 20 20 20 20 20  mit flag..      
38230 20 20 2a 2a 20 54 69 63 6b 65 74 20 5b 32 64 31    ** Ticket [2d1
38240 61 35 63 36 37 64 66 63 32 33 36 33 65 34 34 66  a5c67dfc2363e44f
38250 32 39 64 39 62 62 64 35 37 66 5d 20 32 30 31 31  29d9bbd57f] 2011
38260 2d 30 35 2d 31 38 20 2a 2f 0a 20 20 20 20 20 20  -05-18 */.      
38270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
38280 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
38290 2c 20 26 70 50 61 67 65 4f 6e 65 29 3b 0a 20 20  , &pPageOne);.  
382a0 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50        pList = pP
382b0 61 67 65 4f 6e 65 3b 0a 20 20 20 20 20 20 20 20  ageOne;.        
382c0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 3d 20  pList->pDirty = 
382d0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
382e0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
382f0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
38300 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  if( ALWAYS(pList
38310 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
38320 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
38330 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2c 20  (pPager, pList, 
38340 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2c 20  pPager->dbSize, 
38350 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
38360 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
38370 72 65 66 28 70 50 61 67 65 4f 6e 65 29 3b 0a 20  ref(pPageOne);. 
38380 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
38390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
383a0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
383b0 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
383c0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20 20  pPCache);.      
383d0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
383e0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
383f0 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65  ing block update
38400 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  s the change-cou
38410 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f  nter. Exactly ho
38420 77 20 69 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f  w it.      ** do
38430 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
38440 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
38450 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
38460 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
38470 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  .      ** was en
38480 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
38490 20 74 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68   time, and if th
384a0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  is transaction m
384b0 65 65 74 73 20 74 68 65 20 0a 20 20 20 20 20 20  eets the .      
384c0 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74 65  ** runtime crite
384d0 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20 6f  ria to use the o
384e0 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20 20  peration: .     
384f0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   **.      **    
38500 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * The file-syste
38510 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
38520 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
38530 65 72 74 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  erty for.      *
38540 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
38550 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
38560 20 61 6e 64 20 0a 20 20 20 20 20 20 2a 2a 20 20   and .      **  
38570 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20    * This commit 
38580 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
38590 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e   multi-file tran
385a0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
385b0 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74     **    * Exact
385c0 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
385d0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
385e0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
385f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
38600 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
38610 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
38620 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c  on was not enabl
38630 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
38640 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  me, then the.   
38650 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72     ** pager_incr
38660 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29  _changecounter()
38670 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
38680 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  led to update th
38690 65 20 63 68 61 6e 67 65 0a 20 20 20 20 20 20 2a  e change.      *
386a0 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e  * counter in 'in
386b0 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66  direct-mode'. If
386c0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
386d0 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  n is compiled in
386e0 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 73   but.      ** is
386f0 20 6e 6f 74 20 61 70 70 6c 69 63