/ Hex Artifact Content
Login

Artifact cc60816e677528e4c2e23bbf56ee5c81f4cdfe58:


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 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  f.};../*.** A op
5240: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
5250: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5260: 73 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20  struct Pager. A 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
5280: 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f  * some of the mo
5290: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d  re important mem
52a0: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f  ber variables fo
52b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74  llows:.**.** eSt
52c0: 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ate.**.**   The 
52d0: 63 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20  current 'state' 
52e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
52f0: 65 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  ect. See the com
5300: 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a  ment and state.*
5310: 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76  *   diagram abov
5320: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
5330: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
5340: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c   state..**.** eL
5350: 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ock.**.**   For 
5360: 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64  a real on-disk d
5370: 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72  atabase, the cur
5380: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
5390: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
53a0: 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  ile -.**   NO_LO
53b0: 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
53c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
53d0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
53e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  ..**.**   For a 
53f0: 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
5400: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
5410: 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63  (neither of whic
5420: 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a  h require any.**
5430: 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20     locks), this 
5440: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
5450: 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53  ys set to EXCLUS
5460: 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20  IVE_LOCK. Since 
5470: 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61  such.**   databa
5480: 73 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20  ses always have 
5490: 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d  Pager.exclusiveM
54a0: 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69  ode==1, this tri
54b0: 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  cks the pager.**
54c0: 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68     logic into th
54d0: 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61  inking that it a
54e0: 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74  lready has all t
54f0: 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c  he locks it will
5500: 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20   ever.**   need 
5510: 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74  (and no reason t
5520: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e  o release them).
5530: 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65  .**.**   In some
5540: 20 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75   (obscure) circu
5550: 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76  mstances, this v
5560: 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f  ariable may also
5570: 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20   be set to.**   
5580: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
5590: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
55a0: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
55b0: 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  of UNKNOWN_LOCK 
55c0: 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73  for.**   details
55d0: 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f  ..**.** changeCo
55e0: 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20  untDone.**.**   
55f0: 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72  This boolean var
5600: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
5610: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5620: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5630: 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d  er .**   (the 4-
5640: 62 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c  byte header fiel
5650: 64 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  d at byte offset
5660: 20 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62   24 of the datab
5670: 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a  ase file) is .**
5680: 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d     not updated m
5690: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e  ore often than n
56a0: 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a  ecessary. .**.**
56b0: 20 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20     It is set to 
56c0: 74 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68  true when the ch
56d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
56e0: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77  ld is updated, w
56f0: 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f  hich .**   can o
5700: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e  nly happen if an
5710: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
5720: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
5730: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
5740: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
5750: 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20   (set to false) 
5760: 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c  whenever an excl
5770: 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  usive lock is .*
5780: 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64  *   relinquished
5790: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
57a0: 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65   file. Each time
57b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
57c0: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20  s committed,.** 
57d0: 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e    The changeCoun
57e0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e  tDone flag is in
57f0: 73 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69  spected. If it i
5800: 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b  s true, the work
5810: 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e   of.**   updatin
5820: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
5830: 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  nter is omitted 
5840: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5850: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
5860: 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e  **   This mechan
5870: 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ism means that w
5880: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  hen running in e
5890: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61  xclusive mode, a
58a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
58b0: 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61    need only upda
58c0: 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
58d0: 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20  unter once, for 
58e0: 74 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61  the first transa
58f0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69  ction.**   commi
5900: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d  tted..**.** setM
5910: 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68  aster.**.**   Wh
5920: 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  en PagerCommitPh
5930: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
5940: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74  ed to commit a t
5950: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
5960: 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20  ay.**   (or may 
5970: 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d  not) specify a m
5980: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
5990: 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  me to be written
59a0: 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20   into the .**   
59b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
59c0: 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64  ore it is synced
59d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
59e0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
59f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
5a00: 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65  contains a maste
5a10: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5a20: 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20  r affects .**   
5a30: 74 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68  the way in which
5a40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5a50: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61  e is finalized a
5a60: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
5a70: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f  tion is .**   co
5a80: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5a90: 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e  d back when runn
5aa0: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5ab0: 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f  mode=PERSIST" mo
5ac0: 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f  de..**   If a jo
5ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
5ae0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  not contain a ma
5af0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b00: 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20  nter, it is.**  
5b10: 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76   finalized by ov
5b20: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5b30: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
5b40: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20  er with zeroes. 
5b50: 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20  If.**   it does 
5b60: 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72  contain a master
5b70: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5b90: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a  e is finalized .
5ba0: 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69  **   by truncati
5bb0: 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  ng it to zero by
5bc0: 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20  tes, just as if 
5bd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
5be0: 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e  ere .**   runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64  de=truncate" mod
5c10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e  e..**.**   Journ
5c20: 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f  al files that co
5c30: 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75  ntain master jou
5c40: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61  rnal pointers ca
5c50: 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65  nnot be finalize
5c60: 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79  d.**   simply by
5c70: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c80: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
5c90: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5ca0: 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d  s, as the.**   m
5cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
5cc0: 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65  inter could inte
5cd0: 72 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a  rfere with hot-j
5ce0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
5cf0: 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73  of any.**   subs
5d00: 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75  equently interru
5d10: 70 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  pted transaction
5d20: 20 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65   that reuses the
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5d40: 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20  *.**   The flag 
5d50: 69 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f  is cleared as so
5d60: 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  on as the journa
5d70: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5d80: 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20  zed (either.**  
5d90: 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50   by PagerCommitP
5da0: 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72  haseTwo or Pager
5db0: 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e  Rollback). If an
5dc0: 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e   IO error preven
5dd0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72  ts the.**   jour
5de0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
5df0: 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ing successfully
5e00: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
5e10: 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a  setMaster flag.*
5e20: 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61  *   is cleared a
5e30: 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70  nyway (and the p
5e40: 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74  ager will move t
5e50: 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a  o ERROR state)..
5e60: 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c  **.** doNotSpill
5e70: 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  , doNotSyncSpill
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74  .**.**   These t
5e90: 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  wo boolean varia
5ea0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5eb0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74  */..  u8 bUseFet
7c70: 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
7c80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7c90: 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69   xFetch() */.  i
7ca0: 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20  nt nMmapOut;    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7cc0: 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67  mber of mmap pag
7cd0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  es currently out
7ce0: 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  standing */.  sq
7cf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d  lite3_int64 mxMm
7d00: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73  ap;       /* Des
7d10: 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  ired maximum mma
7d20: 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64  p size */.  PgHd
7d30: 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r *pMmapFreelist
7d40: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
7d50: 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67  of free mmap pag
7d60: 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74  e headers (pDirt
7d70: 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y) */.  /*.  ** 
7d80: 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69  End of the routi
7d90: 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c  nely-changing cl
7da0: 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a  ass members.  **
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31  *********/..  u1
7e00: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7e20: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
7e30: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7e40: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
7e50: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
7e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e70: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
7e80: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
7e90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
7ea0: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
7eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7ec0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
7ed0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33  .xOpen() */.  u3
7ee0: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
7ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
7f00: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
7f10: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
7f20: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
7f30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f50: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
7f60: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
7f90: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
7fa0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34  atabase */.  i64
7fb0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
7fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
7fd0: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
7fe0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
7ff0: 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  les */.  char *z
8000: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
8010: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8020: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
8040: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
8050: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
8070: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
8080: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
8090: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
80a0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
80b0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
80c0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
80d0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
80e0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
80f0: 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74  ler */.  int aSt
8100: 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  at[3];          
8110: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61       /* Total ca
8120: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73  che hits, misses
8130: 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23   and writes */.#
8140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8150: 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  T.  int nRead;  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8180: 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  s read */.#endif
8190: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
81a0: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
81b0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
81c0: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
81d0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
81e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
81f0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
8200: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
8210: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
8220: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
8230: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8240: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8250: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8260: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8270: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8280: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8290: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
82a0: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
82b0: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
82c0: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
82d0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
82e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
82f0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
8300: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
8310: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
8320: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
8330: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8340: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8350: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8360: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8370: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8380: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8390: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
83a0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
83b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
83c0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
83d0: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
83e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
83f0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
8400: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
8410: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
8420: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
8430: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8440: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8450: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8460: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8470: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8480: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8490: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
84a0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
84b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
84c0: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
84d0: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
84e0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
84f0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8500: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8510: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8520: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8530: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8540: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8550: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8560: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8570: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68  RITE 2../*.** Th
8580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
8590: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
85a0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
85b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
85c0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
85d0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
85e0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
85f0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
8600: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
8610: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
8620: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
8630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8640: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
8650: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
8660: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8670: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8680: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
8690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86a0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
86b0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
86c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
86d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
86e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86f0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
8700: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
8710: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
8720: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
8730: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
8740: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
8750: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
8760: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
8770: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
8780: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
8790: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
87a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
87b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
87c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
87d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
87e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
87f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
8800: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
8810: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
8820: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8830: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
8840: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
8850: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8860: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
8870: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
8880: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
88a0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
88b0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
88c0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
88d0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
88e0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
88f0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
8900: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
8910: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
8920: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
8930: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
8940: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
8950: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
8960: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8970: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
8980: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
8990: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
89a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
89b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
89c0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
89d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
89e0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
89f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8a00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
8a10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
8a20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
8a30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
8a40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
8a50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8a60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
8a70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
8a80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
8a90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
8aa0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
8ab0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
8ac0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
8ad0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
8ae0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8af0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8b00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8b10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8b20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8b30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8b40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8b50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8b60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8b70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8b80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
8b90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
8ba0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
8bb0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
8bc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
8bd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
8be0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8bf0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8c00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8c10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8c20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8c30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8c40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8c50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8c60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8c70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8c80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
8c90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8ca0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
8cb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
8cc0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
8cd0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
8ce0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8cf0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8d00: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8d10: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8d20: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8d30: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8d40: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8d50: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8d60: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8d70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8d80: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
8d90: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8da0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8db0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
8dc0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
8dd0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
8de0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8df0: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8e00: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8e10: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8e30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8e40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8e50: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8e60: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8e70: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8e80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
8e90: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
8ea0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
8eb0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
8ec0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
8ed0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
8ee0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8ef0: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8f00: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8f10: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8f20: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8f30: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8f40: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8f60: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8f70: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8f80: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
8f90: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
8fa0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  f../*.** The mac
8fb0: 72 6f 20 55 53 45 46 45 54 43 48 20 69 73 20 74  ro USEFETCH is t
8fc0: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 61 6c  rue if we are al
8fd0: 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74 68 65  lowed to use the
8fe0: 20 78 46 65 74 63 68 20 61 6e 64 20 78 55 6e 66   xFetch and xUnf
8ff0: 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63  etch.** interfac
9000: 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  es to access the
9010: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
9020: 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f  memory-mapped I/
9030: 4f 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  O..*/.#ifdef SQL
9040: 49 54 45 5f 44 49 53 41 42 4c 45 5f 4d 4d 41 50  ITE_DISABLE_MMAP
9050: 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54  .# define USEFET
9060: 43 48 28 78 29 20 30 0a 23 65 6c 73 65 0a 23 20  CH(x) 0.#else.# 
9070: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9080: 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74  x) ((x)->bUseFet
9090: 63 68 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ch).#endif../*.*
90a0: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  * The maximum le
90b0: 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
90c0: 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a  is (2^31 - 1)..*
90d0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
90e0: 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33  MAX_PGNO 2147483
90f0: 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  647../*.** The a
9100: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
9110: 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65 20  macro is a file 
9120: 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70 65  descriptor (type
9130: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e   sqlite3_file*).
9140: 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66 20  .** Return 0 if 
9150: 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  it is not open, 
9160: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74  or non-zero (but
9170: 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69 73   not 1) if it is
9180: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9190: 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73 69  so that expressi
91a0: 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74 74  ons can be writt
91b0: 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  en as:.**.**   i
91c0: 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
91d0: 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a  ->jfd) ){ ....**
91e0: 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  .** instead of.*
91f0: 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67 65  *.**   if( pPage
9200: 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
9210: 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69   ){ ....*/.#defi
9220: 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20 28  ne isOpen(pFd) (
9230: 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73 29  (pFd)->pMethods)
9240: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9250: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
9260: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
9270: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
9280: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
9290: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
92a0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
92b0: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
92c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
92d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
92e0: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
92f0: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
9300: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
9310: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9320: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9330: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9340: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9350: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9360: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
9370: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
9380: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
9390: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
93a0: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
93b0: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
93c0: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
93d0: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
93e0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
93f0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9400: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9410: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9420: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9430: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9440: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9450: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9460: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
9470: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
9480: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
9490: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
94a0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
94b0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
94c0: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
94d0: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
94e0: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
94f0: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9500: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9510: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9520: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9530: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9540: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9550: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9560: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9570: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9580: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
9590: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
95a0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
95b0: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
95c0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
95d0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
95e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
95f0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9600: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9610: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9620: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9630: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9640: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9650: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9660: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9670: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9680: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9690: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
96a0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
96b0: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
96c0: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
96d0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
96e0: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
96f0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9700: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9710: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9720: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9730: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9740: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9750: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9760: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9770: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9780: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9790: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
97a0: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
97b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
97c0: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
97d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
97e0: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
97f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9800: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9810: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9820: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9830: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9840: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9850: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9860: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9870: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9880: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9890: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
98a0: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
98b0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
98c0: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
98d0: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
98e0: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
98f0: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9900: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9910: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9920: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9930: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9940: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9950: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9960: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9970: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9980: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9990: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
99a0: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
99b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
99c0: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
99d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
99e0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
99f0: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9a00: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9a10: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9a20: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9a30: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9a40: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9a50: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9a60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9a70: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9a80: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a90: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9aa0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9ab0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9ac0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ad0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
9ae0: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
9af0: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
9b00: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
9b10: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9b20: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
9b30: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
9b40: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
9b50: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
9b60: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
9b70: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
9b80: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
9b90: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
9ba0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
9bb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9bc0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
9bd0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
9be0: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9bf0: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9c00: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
9c10: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
9c20: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
9c30: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
9c40: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
9c50: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
9c60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9c70: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9c80: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9c90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ca0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
9cb0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
9cc0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
9cd0: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
9ce0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9cf0: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
9d00: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9d10: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9d20: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9d30: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9d40: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9d50: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9d60: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
9d70: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
9d80: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9d90: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9da0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9db0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9dc0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
9dd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9de0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
9df0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
9e00: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
9e10: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9e20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9e30: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
9e40: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
9e50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9e60: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
9e70: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
9e80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9e90: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9ea0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
9eb0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
9ec0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9ed0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
9ee0: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
9ef0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9f10: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
9f20: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
9f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
9f40: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
9f50: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9f60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9f70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f90: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9fa0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
9fb0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
9fc0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
9fd0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
9fe0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
9ff0: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a000: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a020: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a030: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a040: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a050: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a060: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a070: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a080: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a090: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a0a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a0b0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a0c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a0d0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a0e0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a0f0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a100: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a110: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a120: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a130: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a150: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a160: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a170: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a180: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a190: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a1a0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a1b0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a1c0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1d0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a1e0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a1f0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a200: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a210: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a220: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a230: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a240: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a250: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a260: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a270: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a280: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a290: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2b0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a2c0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a2d0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a2e0: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a2f0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a300: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a310: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a320: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a330: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a340: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a350: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a360: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a370: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a380: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a390: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a3a0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a3b0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a3c0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a3d0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a3e0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a3f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a400: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a410: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a420: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a430: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a440: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a450: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a460: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a470: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a480: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a490: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a4a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a4b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a4c0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a4d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a4e0: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a4f0: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a500: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a510: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a520: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a530: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a540: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a550: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a560: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a570: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a580: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a590: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a5a0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a5b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5c0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a5d0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a5e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a5f0: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a600: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a610: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a620: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a630: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a640: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a650: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a660: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a670: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a680: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a690: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a6a0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a6b0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a6c0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a6d0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a6e0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a6f0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a700: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a710: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a720: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a730: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a740: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a750: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a760: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a770: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a780: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a790: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a7a0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a7b0: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a7c0: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
a7d0: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
a7e0: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
a7f0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
a800: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
a810: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
a820: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
a830: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
a840: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
a850: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
a860: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
a870: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a880: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
a890: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
a8a0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
a8b0: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
a8c0: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
a8d0: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
a8e0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
a8f0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
a900: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
a910: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
a920: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
a930: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
a940: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
a950: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
a960: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
a970: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
a980: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
a990: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
a9a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
a9b0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
a9c0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
a9d0: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
a9e0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
a9f0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
aa00: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
aa10: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
aa20: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
aa30: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
aa40: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
aa50: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
aa60: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aa70: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
aa80: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
aa90: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
aaa0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
aab0: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
aac0: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
aad0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
aae0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
aaf0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ab00: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ab10: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ab20: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ab30: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
ab40: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ab50: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ab60: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ab70: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ab80: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ab90: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
aba0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
abb0: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
abc0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
abd0: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
abe0: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
abf0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
ac00: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
ac10: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
ac20: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
ac30: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
ac40: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
ac50: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
ac60: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ac70: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
ac80: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
ac90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aca0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
acb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
acc0: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
acd0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ace0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
acf0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
ad00: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
ad10: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
ad20: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ad30: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ad40: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
ad50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
ad60: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
ad70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
ad80: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
ad90: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
ada0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
adb0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
adc0: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
add0: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
ade0: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
adf0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
ae00: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
ae10: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
ae20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
ae30: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
ae40: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
ae50: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
ae60: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
ae70: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
ae80: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
ae90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
aea0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
aeb0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
aec0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
aed0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
aee0: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
aef0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
af00: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
af10: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
af20: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
af30: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
af40: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
af50: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
af60: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
af70: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
af80: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
af90: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
afa0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
afb0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
afc0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
afd0: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
afe0: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
aff0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b010: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b020: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b030: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
b040: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
b050: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
b060: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
b070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b080: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b090: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
b0a0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
b0b0: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b0c0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b0d0: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b0e0: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b0f0: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
b100: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
b110: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
b120: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b130: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
b140: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b150: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b160: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b170: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b180: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b190: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
b1a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b1b0: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
b1c0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
b1d0: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
b1e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
b1f0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
b200: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
b210: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
b220: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
b230: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
b240: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
b250: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
b260: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
b270: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
b280: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b290: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b2a0: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
b2b0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
b2c0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
b2d0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
b2e0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
b2f0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
b300: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
b310: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
b320: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
b330: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
b340: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
b350: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
b360: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b370: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
b380: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
b390: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
b3a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b3b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
b3c0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
b3d0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
b3e0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
b3f0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
b400: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
b410: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
b420: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
b430: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  .../*.** Write a
b440: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b450: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
b460: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b470: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
b480: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
b490: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
b4a0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
b4b0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
b4d0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b4e0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b4f0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
b500: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
b510: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
b520: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
b530: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
b540: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
b550: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
b560: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b570: 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68   level eLock, wh
b580: 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68  ich must be eith
b590: 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72  er NO_LOCK.** or
b5a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65   SHARED_LOCK. Re
b5b0: 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
b5c0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63  her or not the c
b5d0: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
b5e0: 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65  .** succeeds, se
b5f0: 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  t the Pager.eLoc
b600: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61  k variable to ma
b610: 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74  tch the (attempt
b620: 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a  ed) new lock..**
b630: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
b640: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
b650: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
b660: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
b670: 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tion is.** calle
b680: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
b690: 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d   it. See the com
b6a0: 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23  ment above the #
b6b0: 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e  define of .** UN
b6c0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
b6d0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
b6e0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
b6f0: 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b   int pagerUnlock
b700: 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  Db(Pager *pPager
b710: 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20  , int eLock){.  
b720: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b730: 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  OK;..  assert( !
b740: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
b750: 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
b760: 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b  >eLock==eLock );
b770: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
b780: 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  ==NO_LOCK || eLo
b790: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
b7a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
b7b0: 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70  ck!=NO_LOCK || p
b7c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
b7d0: 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  r)==0 );.  if( i
b7e0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
b7f0: 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
b800: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
b810: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20  eLock );.    rc 
b820: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
b830: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
b840: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
b850: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
b860: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
b870: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
b880: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
b890: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b8a0: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
b8b0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
b8c0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
b8d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
b8e0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b8f0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b900: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b910: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
b920: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
b930: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
b940: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
b950: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
b960: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
b970: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
b980: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
b990: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
b9a0: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
b9b0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
b9c0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
b9d0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
b9e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
b9f0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
ba00: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
ba10: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
ba20: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
ba30: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
ba40: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
ba50: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
ba60: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
ba70: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
ba80: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
ba90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
baa0: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
bab0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
bac0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
bad0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
bae0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
baf0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
bb00: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
bb10: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
bb20: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
bb30: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
bb40: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
bb50: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
bb60: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
bb70: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
bb80: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
bb90: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
bba0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
bbb0: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
bbc0: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
bbd0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
bbe0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
bbf0: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bc00: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
bc10: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bc20: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bc30: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bc40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bc50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bc60: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bc70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bc80: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bc90: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bca0: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bcb0: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bcc0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bcd0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bce0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bcf0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bd00: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bd10: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bd20: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bd30: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bd40: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bd50: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
bd60: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
bd70: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
bd80: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
bd90: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
bda0: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
bdb0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
bdc0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
bdd0: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
bde0: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
bdf0: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
be00: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
be10: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
be20: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
be30: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
be40: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
be50: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
be60: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
be70: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
be80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
be90: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
bea0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
beb0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
bec0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
bed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
bee0: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
bef0: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
bf00: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
bf10: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
bf20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
bf30: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
bf40: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
bf50: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
bf60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
bf70: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
bf80: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
bf90: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
bfc0: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
bfd0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
bfe0: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c000: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c010: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c040: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c050: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c060: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c070: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c080: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c090: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c0a0: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c0b0: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c0c0: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c0d0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c0e0: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c0f0: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c100: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c110: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c120: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c130: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c140: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c150: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c160: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c170: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c180: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c190: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c1a0: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c1b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c1c0: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c1d0: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c1e0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c1f0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c200: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c210: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c220: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c230: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c240: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c250: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c260: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c270: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c280: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c290: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c2a0: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c2b0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c2c0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c2d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c2e0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c2f0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c300: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c310: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c320: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c330: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c340: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c350: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c360: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c370: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c380: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c390: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c3a0: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c3b0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c3c0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c3d0: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c3e0: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c3f0: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c400: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c410: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c420: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c430: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c440: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c460: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c470: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c480: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c490: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c4a0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c4b0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c4c0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c4d0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c4e0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c4f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c500: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c510: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c520: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c530: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c540: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c550: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c560: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c570: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c580: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c590: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c5a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c5b0: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c5c0: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c5d0: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c5e0: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c5f0: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c600: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c610: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c620: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c630: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c640: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c650: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c660: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c670: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c680: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c690: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c6a0: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c6b0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c6c0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c6d0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c6e0: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c6f0: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c700: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c710: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c720: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c730: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c740: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c750: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
c760: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
c770: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
c780: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
c790: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
c7a0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
c7b0: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
c7c0: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
c7d0: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
c7e0: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
c7f0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
c800: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
c810: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
c820: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
c830: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
c840: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
c850: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
c860: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
c870: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
c880: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
c890: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
c8a0: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
c8b0: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
c8c0: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
c8d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
c8e0: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
c8f0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
c900: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
c910: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
c920: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
c930: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
c940: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
c950: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
c960: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
c970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c980: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
c990: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
c9a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
c9b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c9c0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
c9d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c9e0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
c9f0: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
ca00: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ca10: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ca20: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ca30: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
ca40: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ca50: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
ca60: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
ca70: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
ca80: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
ca90: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
caa0: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cab0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cac0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cad0: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cae0: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
caf0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cb00: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cb10: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cb20: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cb30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cb40: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cb50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cb60: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cb70: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
cb80: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
cb90: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
cba0: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
cbb0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
cbc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cbd0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cbe0: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
cbf0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cc00: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
cc10: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cc20: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
cc30: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc50: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cc60: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cc70: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cc80: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cca0: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
ccb0: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
ccc0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
ccf0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cd00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cd10: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cd20: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cd30: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cd40: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cd50: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
cd60: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cd70: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cd80: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
cd90: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
cda0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
cdb0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
cdc0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
cdd0: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
cde0: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
cdf0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ce00: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
ce10: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
ce20: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
ce30: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
ce40: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
ce50: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
ce60: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
ce70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
ce80: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
ce90: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
cea0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
ceb0: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
cec0: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
ced0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
cee0: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
cef0: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
cf00: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
cf10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cf20: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
cf30: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
cf40: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
cf50: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
cf60: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
cf70: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
cf80: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
cf90: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
cfa0: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
cfb0: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
cfc0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
cfd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
cfe0: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
cff0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d000: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d010: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d020: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d030: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d040: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d050: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d060: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d070: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d080: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d090: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d0a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d0b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d0c0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d0d0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d0e0: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d0f0: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d100: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d110: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d120: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d130: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d140: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d150: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d160: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d170: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d180: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
d190: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
d1a0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
d1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d1d0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
d200: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
d210: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
d220: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
d230: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
d240: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
d260: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
d270: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
d280: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
d290: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
d2a0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
d2b0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
d2c0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
d2d0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
d2e0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
d2f0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
d300: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
d310: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
d320: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
d330: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d340: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
d350: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
d360: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
d370: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
d380: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d390: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
d3a0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
d3b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
d3c0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
d3d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d3e0: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
d3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d400: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
d410: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
d420: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
d430: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
d440: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
d450: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
d460: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
d470: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
d480: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
d490: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
d4a0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
d4b0: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
d4c0: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
d4d0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
d4e0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
d4f0: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
d500: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
d510: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
d520: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
d530: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
d540: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
d550: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
d560: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
d570: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
d580: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
d590: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
d5a0: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
d5b0: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
d5c0: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
d5d0: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
d5e0: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
d5f0: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
d600: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
d610: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
d620: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
d630: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
d640: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
d650: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
d660: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
d670: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
d680: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
d690: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
d6a0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
d6b0: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
d6c0: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
d6d0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
d6e0: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
d6f0: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
d700: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
d710: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
d720: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
d730: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
d740: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
d750: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
d760: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
d770: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
d780: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
d790: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
d7a0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
d7b0: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
d7c0: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
d7d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
d800: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
d810: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
d820: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
d830: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
d840: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
d850: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
d860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
d870: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
d880: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
d890: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
d8a0: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
d8b0: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
d8c0: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
d8d0: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
d8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d8f0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
d900: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
d910: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d920: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
d930: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
d940: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
d950: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
d960: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
d970: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
d980: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
d990: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d9a0: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
d9b0: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
d9c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d9d0: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
d9e0: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
d9f0: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
da00: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
da10: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
da20: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
da30: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
da40: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
da50: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
da60: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
da70: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
da80: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
da90: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
daa0: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
dab0: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
dac0: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
dad0: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
dae0: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
daf0: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
db00: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
db10: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
db20: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
db30: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
db40: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
db50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
db60: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
db70: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
db80: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
db90: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
dba0: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
dbb0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
dbc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
dbd0: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
dbe0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
dbf0: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
dc00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dc10: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dc20: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dc30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dc50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dc60: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dc70: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
dc80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
dc90: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
dca0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
dcb0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
dcc0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
dcd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
dce0: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
dcf0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
dd00: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
dd10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
dd20: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
dd30: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
dd40: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
dd50: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
dd60: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
dd70: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
dd80: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
dd90: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
dda0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
ddb0: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
ddc0: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
ddd0: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
dde0: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
ddf0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
de00: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
de10: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
de20: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
de30: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
de40: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
de50: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
de60: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
de70: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
de80: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
de90: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
dea0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
deb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
dec0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
ded0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
dee0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
def0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df00: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
df10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
df20: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
df30: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
df40: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
df50: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
df60: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
df70: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
df80: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
df90: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
dfa0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
dfb0: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
dfc0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
dfe0: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
dff0: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e000: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e020: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e030: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e040: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e050: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e060: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e070: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e080: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e090: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e0a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e0b0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e0c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e0d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e0e0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e0f0: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e100: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e110: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e120: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e130: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e140: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e150: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e160: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e170: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e180: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e190: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e1a0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e1b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e1c0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e1d0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e1e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e1f0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e200: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e210: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e220: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e230: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e240: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e250: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e260: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e270: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e280: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e290: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e2a0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e2b0: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e2c0: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e2d0: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e2e0: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e2f0: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e300: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e310: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e320: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e330: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e340: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e350: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e360: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e370: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e380: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e390: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e3a0: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e3b0: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e3c0: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e3d0: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e3e0: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e3f0: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e400: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e410: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e420: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e430: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e440: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e450: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e460: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e470: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e480: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e490: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e4a0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e4b0: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e4c0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e4d0: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e4f0: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e500: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e510: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e520: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e530: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e540: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e550: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e560: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e570: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e580: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e590: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e5a0: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e5b0: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e5c0: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e5d0: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e5e0: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e5f0: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e600: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e610: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e620: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e630: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e640: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e650: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e660: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e670: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
e680: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
e690: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
e6a0: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
e6b0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
e6c0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
e6d0: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
e6e0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
e6f0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
e700: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
e710: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e720: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
e730: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
e740: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
e750: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
e760: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
e770: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e780: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e790: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
e7a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
e7b0: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
e7c0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
e7d0: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
e7e0: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
e7f0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
e800: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
e810: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
e820: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
e830: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
e840: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
e850: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
e860: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
e870: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
e880: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e890: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
e8a0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
e8b0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
e8c0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
e8d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
e8e0: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
e8f0: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
e900: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
e910: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
e920: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
e930: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
e940: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e950: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
e960: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
e970: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
e980: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
e990: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
e9a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
e9b0: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
e9c0: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
e9d0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
e9e0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
e9f0: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ea00: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ea10: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
ea20: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
ea30: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
ea40: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
ea50: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ea60: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
ea70: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ea80: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ea90: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
eaa0: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
eab0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
eac0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ead0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eae0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eaf0: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
eb00: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
eb10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eb20: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eb30: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eb40: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eb50: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eb60: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eb70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
eb80: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
eb90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
eba0: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ebb0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ebc0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ebd0: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ebe0: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ebf0: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ec00: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ec10: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
ec20: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
ec30: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
ec40: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
ec50: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
ec60: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
ec70: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
ec80: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
ec90: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
eca0: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
ecb0: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
ecc0: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
ecd0: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
ece0: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
ecf0: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
ed00: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
ed10: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
ed20: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
ed30: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
ed40: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
ed50: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
ed60: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
ed70: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
ed80: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
ed90: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
eda0: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
edb0: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
edc0: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
edd0: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
ede0: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
edf0: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
ee00: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
ee10: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
ee20: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
ee30: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
ee40: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
ee50: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
ee60: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
ee70: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
ee80: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
ee90: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
eea0: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
eeb0: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
eec0: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
eed0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
eee0: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
eef0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ef00: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
ef10: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
ef20: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
ef30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
ef40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ef50: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
ef60: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
ef70: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
ef80: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
ef90: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
efa0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
efb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
efc0: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
efd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
efe0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
eff0: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f000: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f010: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f020: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f030: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f040: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f050: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f060: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f070: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f080: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f090: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f0a0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f0b0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f0c0: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f0d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f0e0: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f0f0: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f100: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f110: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f120: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f130: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f140: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f150: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f160: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f170: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f180: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f190: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f1a0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f1b0: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f1c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f1d0: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f1e0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f1f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f200: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f210: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f220: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f230: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f240: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f250: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f260: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f270: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f280: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f290: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f2a0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f2c0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f2d0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f2e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f2f0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f300: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f310: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f320: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f330: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f340: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f350: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f360: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f370: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f380: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f390: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f3a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f3b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f3c0: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f3d0: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f3e0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f400: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f410: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f420: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f430: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f440: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f450: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f460: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f470: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f490: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f4a0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f4b0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f4c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f4f0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f500: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f510: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f520: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f530: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f540: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f560: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f570: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f580: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f590: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f5a0: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f5b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f5c0: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f5d0: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f5e0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f5f0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f600: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f610: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f620: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f630: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f640: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f650: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f660: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f670: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
f680: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f690: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
f6a0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
f6b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
f6c0: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
f6d0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
f6e0: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
f6f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f700: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
f710: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
f720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
f730: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
f740: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
f750: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
f760: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
f770: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
f780: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
f790: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
f7a0: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
f7b0: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
f7c0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
f7d0: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
f7e0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
f7f0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
f800: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
f810: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
f820: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
f830: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
f840: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
f850: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f860: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
f870: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
f880: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
f890: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
f8a0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f8c0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
f8d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
f8e0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
f8f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
f900: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
f910: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
f920: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
f930: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
f940: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f950: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
f960: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
f970: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
f980: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
f990: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
f9a0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
f9b0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f9c0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
f9d0: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
f9e0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
f9f0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fa00: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fa10: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fa20: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fa30: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fa40: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fa50: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fa60: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fa70: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fa80: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fa90: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
faa0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fab0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fac0: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fad0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fae0: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
faf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fb00: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fb10: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fb20: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
fb30: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fb40: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fb50: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb70: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
fb80: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
fb90: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
fba0: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
fbb0: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
fbc0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fbd0: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
fbe0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
fbf0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
fc00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
fc10: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
fc20: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
fc30: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
fc40: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
fc50: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
fc60: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fc70: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
fc80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
fc90: 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
fca0: 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
fcb0: 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
fcc0: 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
fcd0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
fce0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
fcf0: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
fd00: 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
fd10: 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
fd20: 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
fd30: 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
fd40: 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
fd50: 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
fd60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
fd70: 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
fd80: 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
fd90: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
fda0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
fdb0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
fdc0: 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
fdd0: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
fde0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
fdf0: 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
fe00: 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
fe10: 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
fe20: 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
fe30: 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
fe40: 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
fe50: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
fe60: 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
fe70: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
fe80: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
fe90: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
fea0: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
feb0: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
fec0: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
fed0: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
fee0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
fef0: 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
ff00: 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
ff10: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ff20: 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
ff30: 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
ff40: 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
ff50: 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
ff60: 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
ff70: 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
ff80: 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
ff90: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
ffa0: 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
ffb0: 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
ffc0: 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
ffd0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
ffe0: 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
fff0: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10000 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10010 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
10020 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
10030 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
10040 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
10050 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
10060 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
10070 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10080 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10090 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
100a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
100b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
100c0 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
100d0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
100e0 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
100f0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10100 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10110 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
10120 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
10130 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
10140 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
10150 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
10160 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
10170 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10180 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10190 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
101a0 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
101b0 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
101c0 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
101d0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
101e0 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
101f0 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10200 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10210 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
10220 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
10230 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
10240 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
10250 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
10260 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10270 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10280 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10290 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
102a0 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
102b0 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
102c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
102d0 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
102e0 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
102f0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10300 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10310 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
10320 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
10330 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
10340 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
10350 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
10360 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
10370 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10380 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10390 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
103a0 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
103b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103c0 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
103d0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
103e0 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
103f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10400 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10410 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10420 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
10430 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
10440 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
10450 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
10460 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
10470 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10480 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10490 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
104a0 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
104b0 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
104c0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
104d0 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
104e0 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
104f0 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10500 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10510 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
10520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10530 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
10540 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
10550 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
10560 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10570 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10580 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10590 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
105a0 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
105b0 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
105c0 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
105d0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
105e0 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
105f0 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10600 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10610 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
10620 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
10630 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
10640 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
10650 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
10660 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
10670 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10680 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10690 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
106a0 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
106b0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
106c0 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
106d0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
106e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
106f0 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10710 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10720 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10750 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10760 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10780 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10790 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
107a0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
107d0 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
107e0 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
107f0 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10810 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10820 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10830 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10860 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10870 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10880 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
108a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
108b0 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
108c0 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
108d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
108e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
108f0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10900 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
10910 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
10920 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
10930 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10940 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
10950 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
10960 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
10970 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
10980 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
10990 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
109a0 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
109b0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20 20  ournalOff );..  
109c0 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
109d0 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
109e0 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
109f0 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
10a00 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
10a10 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
10a20 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
10a30 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
10a40 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
10a50 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
10a60 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
10a70 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
10a80 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
10a90 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
10aa0 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
10ab0 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
10ac0 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
10ad0 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
10ae0 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
10af0 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
10b00 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
10b10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
10b20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
10b30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
10b40 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
10b50 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
10b60 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
10b70 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
10b80 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
10b90 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
10ba0 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
10bb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
10bc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
10bd0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
10be0 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
10bf0 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
10c00 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
10c10 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
10c20 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10c30 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10c40 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
10c50 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
10c60 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10c70 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10c80 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10c90 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
10ca0 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
10cb0 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10cc0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10cd0 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10ce0 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
10cf0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10d00 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10d10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10d20 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
10d30 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
10d40 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
10d50 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
10d60 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
10d70 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
10d80 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
10d90 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
10da0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
10db0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
10dc0 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
10dd0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
10de0 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
10df0 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
10e00 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
10e10 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
10e20 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
10e30 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
10e40 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10e50 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
10e60 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
10e70 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
10e80 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
10e90 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
10ea0 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
10eb0 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
10ec0 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
10ed0 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
10ee0 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
10ef0 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
10f00 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
10f10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
10f20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
10f30 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
10f40 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
10f50 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
10f60 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
10f70 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
10f80 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
10f90 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
10fa0 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
10fb0 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
10fc0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
10fd0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
10fe0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
10ff0 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
11000 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
11010 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
11020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11030 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
11040 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11050 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
11060 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11070 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
11080 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
11090 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
110a0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
110b0 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
110c0 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
110d0 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
110e0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
110f0 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
11100 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
11110 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
11120 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
11130 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
11140 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
11170 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
11180 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
11190 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
111a0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
111b0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
111c0 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
111d0 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
111e0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
111f0 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
11200 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
11210 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
11220 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
11230 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
11240 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
11250 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   p;.}../*.** Dis
11260 63 61 72 64 20 74 68 65 20 65 6e 74 69 72 65 20  card the entire 
11270 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11280 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63  in-memory page-c
11290 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ache..*/.static 
112a0 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
112b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
112c0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
112d0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
112e0 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
112f0 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11320 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
11330 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
11340 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
11350 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
11360 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
11370 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
11380 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11390 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
113a0 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
113b0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
113c0 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
113d0 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
113e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
113f0 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11400 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11410 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11420 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11430 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
11440 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
11450 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
11460 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
11470 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
11480 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11490 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
114a0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
114b0 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
114c0 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
114d0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
114e0 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
114f0 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11500 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11510 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11520 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11540 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11550 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11560 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11570 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11580 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11590 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
115a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
115b0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
115c0 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
115d0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
115e0 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
115f0 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11600 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11610 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11620 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
11630 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
11640 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
11650 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
11660 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
11670 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
11680 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11690 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
116a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
116b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
116c0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
116d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
116e0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
116f0 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11700 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11710 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11720 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
11730 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
11740 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
11750 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
11760 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
11770 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
11780 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11790 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
117a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
117b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
117c0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
117d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
117e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
117f0 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11800 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11810 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11820 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
11830 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
11840 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
11850 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
11860 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
11870 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
11880 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11890 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
118a0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
118b0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
118c0 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
118d0 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
118e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
118f0 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11900 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11910 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11920 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11930 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11940 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11950 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11960 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11970 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11980 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11990 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
119a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
119b0 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
119c0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
119d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
119e0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
119f0 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11a00 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11a10 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11a20 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11a30 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11a40 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11a50 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11a60 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11a70 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11a80 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11a90 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11aa0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11ab0 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11ac0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11ad0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11ae0 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11af0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11b00 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11b10 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11b20 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11b30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11b40 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11b50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11b60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11b70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11b80 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11b90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11ba0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11bb0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11bc0 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11bd0 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11be0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11bf0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11c00 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11c10 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11c20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11c30 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11c40 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11c50 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11c60 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11c70 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11c80 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11c90 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11ca0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11cb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11cc0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11cd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11ce0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11cf0 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11d00 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11d20 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11d30 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11d40 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11d50 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11d60 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11d70 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11d80 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11d90 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11da0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11db0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11dc0 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11dd0 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11de0 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11df0 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11e00 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11e10 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11e20 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11e30 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11e40 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11e50 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11e60 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11e70 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11e80 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
11e90 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11ea0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
11eb0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
11ec0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11ed0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11ee0 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
11ef0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11f00 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11f10 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
11f20 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
11f30 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
11f40 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
11f50 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
11f60 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
11f70 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
11f80 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
11f90 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
11fa0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
11fb0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
11fc0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
11fd0 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
11fe0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
11ff0 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12000 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12010 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12020 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12030 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12040 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12050 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12060 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12070 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12080 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12090 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
120a0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
120b0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
120c0 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
120d0 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
120e0 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
120f0 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12100 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12110 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12120 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
12130 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12140 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12150 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12160 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12170 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12180 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12190 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
121a0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
121b0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
121c0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
121d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
121e0 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
121f0 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12200 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12210 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12220 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12230 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12240 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12250 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12260 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12270 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12280 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12290 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
122a0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
122b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
122c0 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
122d0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
122e0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
122f0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12300 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12310 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12320 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12330 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12340 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12350 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12360 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12370 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12380 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12390 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
123a0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
123b0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
123c0 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
123d0 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
123e0 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
123f0 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12400 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12410 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12420 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12440 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12450 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
12460 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
12470 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12480 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12490 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
124a0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
124b0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
124c0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
124d0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
124e0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
124f0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
12500 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12510 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12520 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  lHdr = 0;.  pPag
12530 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
12540 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
12550 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12560 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20  led whenever an 
12570 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72  IOERR or FULL er
12580 72 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65  ror that require
12590 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74  s.** the pager t
125a0 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74  o transition int
125b0 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
125c0 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72  e may ahve occur
125d0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  red..** The firs
125e0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
125f0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
12600 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
12610 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74  the second .** t
12620 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
12630 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
12640 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50  ed by a pager AP
12650 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  I function. The 
12660 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e  .** value return
12670 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
12680 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12690 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
126a0 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  tion. .**.** If 
126b0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
126c0 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55  ent is SQLITE_FU
126d0 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  LL, SQLITE_IOERR
126e0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a   or one of the.*
126f0 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65  * IOERR sub-code
12700 73 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74  s, the pager ent
12710 65 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74  ers the ERROR st
12720 61 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ate and the erro
12730 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f  r code.** is sto
12740 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72  red in Pager.err
12750 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20  Code. While the 
12760 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e  pager remains in
12770 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12780 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41  ,.** all major A
12790 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20  PI calls on the 
127a0 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
127b0 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61  iately return Pa
127c0 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a  ger.errCode..**.
127d0 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61  ** The ERROR sta
127e0 74 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  te indicates tha
127f0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
12800 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
12810 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
12820 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
12830 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
12840 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
12850 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
12860 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12870 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
12880 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
12890 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
128a0 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
128b0 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72  ent error occurr
128c0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
128d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
128e0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
128f0 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74  replayed to rest
12900 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ore the contents
12910 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12920 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20   file (as if.** 
12930 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f  it were a hot-jo
12940 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69  urnal)..*/.stati
12950 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
12960 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12970 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
12980 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
12990 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
129a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d  QLITE_OK || !MEM
129b0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a  DB );.  assert(.
129c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
129d0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
129e0 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
129f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
12a00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
12a10 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
12a20 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
12a30 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
12a40 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12a50 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51  _FULL || rc2==SQ
12a60 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
12a70 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
12a80 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
12a90 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12aa0 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  ER_ERROR;.  }.  
12ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
12ac0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
12ad0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
12ae0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
12af0 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  e);../*.** This 
12b00 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
12b10 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
12b20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
12b30 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
12b40 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
12b50 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
12b60 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
12b70 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
12b80 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
12b90 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
12ba0 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
12bb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
12bc0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
12bd0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
12be0 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
12bf0 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
12c00 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
12c10 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
12c20 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
12c30 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12c40 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
12c50 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
12c60 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c  te. If it is cal
12c70 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f  led.** in PAGER_
12c80 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48  NONE or PAGER_SH
12c90 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74  ARED state and t
12ca0 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20  he lock held is 
12cb0 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76  less.** exclusiv
12cc0 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45  e than a RESERVE
12cd0 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20  D lock, it is a 
12ce0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  no-op..**.** Oth
12cf0 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69  erwise, any acti
12d00 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ve savepoints ar
12d10 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  e released..**.*
12d20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
12d30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74   file is open, t
12d40 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c  hen it is "final
12d50 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f  ized". Once a jo
12d60 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68  urnal .** file h
12d70 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  as been finalize
12d80 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  d it is not poss
12d90 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74  ible to use it t
12da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a  o roll back a .*
12db0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e  * transaction. N
12dc0 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f  or will it be co
12dd0 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61  nsidered to be a
12de0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20   hot-journal by 
12df0 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f  this.** or any o
12e00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
12e10 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c  nnection. Exactl
12e20 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20  y how a journal 
12e30 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20  is finalized.** 
12e40 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
12e50 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61  er or not the pa
12e60 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
12e70 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
12e80 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72   and.** the curr
12e90 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ent journal-mode
12ea0 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d   (Pager.journalM
12eb0 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66  ode value), as f
12ec0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
12ed0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
12ee0 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ORY.**     Journ
12ef0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
12f00 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f  or is simply clo
12f10 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f  sed. This destro
12f20 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e  ys an .**     in
12f30 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e  -memory journal.
12f40 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
12f50 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a  Mode==TRUNCATE.*
12f60 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
12f70 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
12f80 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
12f90 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   size..**.**   j
12fa0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53  ournalMode==PERS
12fb0 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66  IST.**     The f
12fc0 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66  irst 28 bytes of
12fd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12fe0 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68  e are zeroed. Th
12ff0 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a  is invalidates.*
13000 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20  *     the first 
13010 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
13020 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  n the file, and 
13030 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65  hence the entire
13040 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
13050 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64  file. An invalid
13060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
13070 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  nnot be rolled b
13080 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75  ack..**.**   jou
13090 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45  rnalMode==DELETE
130a0 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72  .**     The jour
130b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  nal file is clos
130c0 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75  ed and deleted u
130d0 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65  sing sqlite3OsDe
130e0 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  lete()..**.**   
130f0 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69    If the pager i
13100 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
13110 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69  lusive mode, thi
13120 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61  s method of fina
13130 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68  lizing.**     th
13140 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13150 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e  s never used. In
13160 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f  stead, if the jo
13170 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20  urnalMode is.** 
13180 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74      DELETE and t
13190 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
131a0 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
131b0 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69  he method descri
131c0 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20  bed under.**    
131d0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
131e0 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e  RSIST is used in
131f0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74  stead..**.** Aft
13200 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
13210 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65  s finalized, the
13220 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
13230 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
13240 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e  te..** If runnin
13250 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69  g in non-exclusi
13260 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  ve rollback mode
13270 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  , the lock on th
13280 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f  e file is .** do
13290 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48  wngraded to a SH
132a0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
132b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
132c0 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
132d0 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  or occurs. If an
132e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
132f0 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74  ring.** any of t
13300 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73  he IO operations
13310 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
13320 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
13330 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64   unlock the.** d
13340 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65  atabase then the
13350 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
13360 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
13370 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a  e user. If the .
13380 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
13390 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
133a0 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c  rnal file fails,
133b0 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73   then the code s
133c0 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f  till.** tries to
133d0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
133e0 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74  base file if not
133f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13400 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e  de. If the.** un
13410 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66  lock operation f
13420 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68  ails as well, th
13430 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72  en the first err
13440 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a  or code related.
13450 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
13460 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65  error encountere
13470 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d (the journal f
13480 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29  inalization one)
13490 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
134a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
134b0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
134c0 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
134d0 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65  er, int hasMaste
134e0 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
134f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13500 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
13510 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
13520 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
13530 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
13540 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
13550 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
13560 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
13570 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
13580 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  eration */..  /*
13590 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
135a0 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f  he pager does no
135b0 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  t have an open w
135c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
135d0 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73  .  ** or at leas
135e0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
135f0 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  k. This function
13600 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77   may be called w
13610 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69  hen there.  ** i
13620 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
13630 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75  action active bu
13640 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  t a RESERVED or 
13650 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a  greater lock is.
13660 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20    ** held under 
13670 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65  two circumstance
13680 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  s:.  **.  **   1
13690 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73  . After a succes
136a0 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  sful hot-journal
136b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
136c0 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a   called with.  *
136d0 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50  *      eState==P
136e0 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c  AGER_NONE and eL
136f0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
13700 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  OCK..  **.  **  
13710 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74   2. If a connect
13720 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ion with locking
13730 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20  _mode=exclusive 
13740 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
13750 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20  SIVE .  **      
13760 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61  lock switches ba
13770 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ck to locking_mo
13780 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68  de=normal and th
13790 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20  en executes a.  
137a0 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61  **      read-tra
137b0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66  nsaction, this f
137c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
137d0 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50  d with eState==P
137e0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a  AGER_READER .  *
137f0 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b  *      and eLock
13800 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13810 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74   when the read-t
13820 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c  ransaction is cl
13830 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  osed..  */.  ass
13840 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
13850 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
13860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13870 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
13880 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  ER_ERROR );.  if
13890 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
138a0 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  <PAGER_WRITER_LO
138b0 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  CKED && pPager->
138c0 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c  eLock<RESERVED_L
138d0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
138e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
138f0 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ..  releaseAllSa
13900 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29  vepoints(pPager)
13910 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
13920 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13930 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  || pPager->pInJo
13940 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66  urnal==0 );.  if
13950 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
13960 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  >jfd) ){.    ass
13970 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
13980 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
13990 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
139b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
139c0 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
139d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
139e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
139f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13a00 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13a10 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
13a20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13a30 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
13a40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
13a50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a60 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
13a70 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
13a80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
13a90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13aa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
13ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13ae0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
13af0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
13b00 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13b10 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
13b20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13b30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13b40 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13b50 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
13b60 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
13b70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
13b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13b90 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
13ba0 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
13bb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
13bc0 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
13bd0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
13be0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13bf0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c10 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
13c20 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
13c30 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
13c40 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
13c50 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
13c60 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
13c70 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
13c80 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
13c90 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
13ca0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
13cb0 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13cc0 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
13cd0 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
13ce0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
13cf0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
13d00 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
13d10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
13d20 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  rnal. .      */.
13d30 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74        int bDelet
13d40 65 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65  e = (!pPager->te
13d50 6d 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65  mpFile && sqlite
13d60 33 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70  3JournalExists(p
13d70 50 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20  Pager->jfd));.  
13d80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13d90 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13da0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13db0 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
13dc0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
13dd0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13df0 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20  MEMORY .        
13e00 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
13e10 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13e20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
13e30 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
13e40 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13e50 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
13e60 20 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20      if( bDelete 
13e70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13e80 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
13e90 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
13ea0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
13eb0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
13ec0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
13ed0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
13ee0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
13ef0 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
13f00 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
13f10 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
13f20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13f30 3e 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71  >dbSize==0 && sq
13f40 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13f50 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13f60 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67  che)>0 ){.    Pg
13f70 48 64 72 20 2a 70 20 3d 20 70 61 67 65 72 5f 6c  Hdr *p = pager_l
13f80 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
13f90 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
13fa0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
13fb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
13fc0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 29  te3PagerUnref(p)
13fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13fe0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  if..  sqlite3Bit
13ff0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
14000 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
14010 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
14020 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  rnal = 0;.  pPag
14030 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
14040 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
14050 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
14060 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65  Cache);.  sqlite
14070 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
14080 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
14090 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
140a0 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
140b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
140c0 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
140d0 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  WAL write-lock, 
140e0 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66  if any. Also, if
140f0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
14100 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c  was in .    ** l
14110 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14120 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69  usive mode but i
14130 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f  s no longer, dro
14140 70 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20  p the EXCLUSIVE 
14150 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c  .    ** lock hel
14160 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
14170 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
14180 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
14190 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73  WalEndWriteTrans
141a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
141b0 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Wal);.    assert
141c0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
141d0 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
141e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
141f0 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67   bCommit && pPag
14200 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70  er->dbFileSize>p
14210 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
14220 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61  .    /* This bra
14230 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
14240 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
14250 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f  ransaction in ro
14260 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20  llback-journal. 
14270 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68     ** mode if th
14280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14290 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65  on disk is large
142a0 72 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62  r than the datab
142b0 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
142c0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
142d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
142e0 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
142f0 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
14300 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65  on .    ** succe
14310 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65  ssfully committe
14320 64 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55  d, but the EXCLU
14330 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69  SIVE lock is sti
14340 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20  ll held on the. 
14350 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69     ** file. So i
14360 74 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75  t is safe to tru
14370 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
14380 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d  se file to its m
14390 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65  inimum.    ** re
143a0 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f  quired size.  */
143b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
143c0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c  ger->eLock==EXCL
143d0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
143e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
143f0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
14400 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
14410 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
14420 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14430 20 0a 20 20 20 26 26 20 28 21 70 61 67 65 72 55   .   && (!pagerU
14440 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  seWal(pPager) ||
14450 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
14460 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
14470 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a  >pWal, 0)).  ){.
14480 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 55      rc2 = pagerU
14490 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
144a0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
144b0 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
144c0 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
144d0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74   }.  pPager->eSt
144e0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
144f0 45 52 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  ER;.  pPager->se
14500 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20  tMaster = 0;..  
14510 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
14520 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
14530 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
14540 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
14550 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
14560 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
14570 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
14580 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49  e file. .**.** I
14590 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
145a0 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
145b0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
145c0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
145d0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
145e0 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49   at this time. I
145f0 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e  nstead, pager_un
14600 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  lock() is called
14610 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f  . The.** call to
14620 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
14630 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c  will discard all
14640 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
14650 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20  , unlock.** the 
14660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
14670 64 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  d move the pager
14680 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74   back to OPEN st
14690 61 74 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a  ate. If this .**
146a0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72   means that ther
146b0 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
146c0 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
146d0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
146e0 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74  next .** connect
146f0 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ion to obtain a 
14700 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
14710 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
14720 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
14730 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69   .** will roll i
14740 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
14750 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
14760 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
14770 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
14780 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
14790 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
147a0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
147b0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
147c0 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
147d0 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
147e0 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
147f0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57  e ERROR state. W
14800 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
14810 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
14820 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
14830 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
14840 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
14850 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
14860 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
14870 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
14890 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
148a0 4f 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OR && pPager->eS
148b0 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
148c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
148d0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
148e0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
148f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
14900 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
14910 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  ER_LOCKED ){.   
14920 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
14930 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
14940 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14950 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
14960 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14970 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14980 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
14990 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
149a0 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  iveMode ){.     
149b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
149c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
149d0 45 41 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70  EADER );.      p
149e0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
149f0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  tion(pPager, 0, 
14a00 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
14a10 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
14a20 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ger);.}../*.** P
14a30 61 72 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d  arameter aData m
14a40 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
14a50 75 66 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d  uffer of pPager-
14a60 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a  >pageSize bytes.
14a70 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70  ** of data. Comp
14a80 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ute and return a
14a90 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   checksum based 
14aa0 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ont the contents
14ab0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
14ac0 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74 68 65   of data and the
14ad0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
14ae0 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f pPager->cksumI
14af0 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nit..**.** This 
14b00 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
14b10 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65  ecksum. It is re
14b20 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
14b30 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
14b40 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
14b50 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  e (pPager->cksum
14b60 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72 79 20  Init) and every 
14b70 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66  200th byte.** of
14b80 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2c 20   the page data, 
14b90 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 62 79  starting with by
14ba0 74 65 20 6f 66 66 73 65 74 20 28 70 50 61 67 65  te offset (pPage
14bb0 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29  r->pageSize%200)
14bc0 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69  ..** Each byte i
14bd0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
14be0 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e   an 8-bit unsign
14bf0 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  ed integer..**.*
14c00 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66  * Changing the f
14c10 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63  ormula used to c
14c20 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68 65 63  ompute this chec
14c30 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20  ksum results in 
14c40 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62  an.** incompatib
14c50 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  le journal file 
14c60 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
14c70 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
14c80 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
14c90 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
14ca0 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
14cb0 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20  ly .** scenario 
14cc0 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
14cd0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
14ce0 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
14cf0 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20  be changed. .** 
14d00 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20  It is much less 
14d10 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
14d20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
14d30 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
14d40 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
14d50 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
14d60 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
14d70 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
14d80 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
14d90 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
14da0 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
14db0 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
14dc0 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
14dd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ion..*/.static u
14de0 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50  32 pager_cksum(P
14df0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
14e00 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a  nst u8 *aData){.
14e10 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50    u32 cksum = pP
14e20 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
14e30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
14e40 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65  ksum value to re
14e50 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20  turn */.  int i 
14e60 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
14e70 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20  ze-200;         
14e80 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
14e90 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30   */.  while( i>0
14ea0 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
14eb0 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
14ec0 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
14ed0 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
14ee0 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65  /*.** Report the
14ef0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73 69   current page si
14f00 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ze and number of
14f10 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
14f20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63  back.** to the c
14f30 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  odec..*/.#ifdef 
14f40 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14f60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67  erReportSize(Pag
14f70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14f80 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
14f90 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20  cSizeChng ){.   
14fa0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
14fb0 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e  izeChng(pPager->
14fc0 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e  pCodec, pPager->
14fd0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65 72       (int)pPager
15000 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d  ->nReserve);.  }
15010 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
15020 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  e pagerReportSiz
15030 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  e(X)     /* No-o
15040 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73  p if we do not s
15050 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a  upport a codec *
15060 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
15070 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
15080 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
15090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
150a0 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
150b0 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
150c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
150d0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
150e0 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
150f0 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
15100 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
15110 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
15120 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
15130 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
15140 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
15150 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
15160 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
15170 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
15180 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
15190 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
151a0 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
151b0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
151c0 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
151d0 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
151e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
151f0 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
15200 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
15210 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
15220 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
15230 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
15240 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
15250 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
15260 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
15270 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
15280 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
15290 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
152a0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
152b0 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
152c0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
152d0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
152e0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
152f0 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
15300 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
15310 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
15320 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
15330 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
15340 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
15350 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
15360 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
15370 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
15380 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
15390 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
153a0 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
153b0 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
153c0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
153d0 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
153e0 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
153f0 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
15400 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
15410 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
15420 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
15430 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
15440 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
15450 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
15460 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
15470 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15480 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
15490 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
154a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
154b0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
154c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
154d0 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
154e0 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
154f0 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
15500 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15510 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
15520 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
15530 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
15540 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
15550 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
15560 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
15570 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
15580 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
15590 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
155a0 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
155b0 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
155c0 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
155d0 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
155e0 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
155f0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
15600 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
15610 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
15620 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
15630 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
15640 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
15650 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
15660 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
15670 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
15680 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
15690 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
156a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
156b0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
156c0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
156d0 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
156e0 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
156f0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
15700 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
15710 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
15720 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
15730 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
15740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
15750 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
15760 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
15770 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
15780 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
157b0 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
157c0 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
157d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
157e0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
157f0 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
15800 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
15810 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
15820 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
15830 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
15840 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
15850 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15870 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
15880 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
15890 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
158a0 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
158b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
158c0 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
158d0 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
158e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
158f0 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
15900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
15910 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
15920 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
15930 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15950 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
15960 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
15970 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
15980 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
15990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
159a0 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
159b0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
159c0 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
159f0 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
15a00 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
15a10 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
15a20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
15a30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
15a40 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
15a50 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
15a60 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
15a70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15a80 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
15a90 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73   synced */..  as
15aa0 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
15ab0 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
15ac0 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
15ad0 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
15ae0 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
15af0 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
15b00 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
15b10 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
15b20 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
15b30 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
15b40 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
15b50 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
15b60 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
15b70 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
15b80 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
15b90 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
15ba0 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
15bb0 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
15bc0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
15bd0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
15be0 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
15bf0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
15c00 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
15c10 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
15c20 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
15c30 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
15c40 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
15c50 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
15c60 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
15c70 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
15c80 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
15c90 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
15ca0 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
15cb0 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
15cc0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
15cd0 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
15ce0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
15cf0 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
15d00 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
15d10 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
15d20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15d30 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
15d40 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
15d50 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
15d60 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
15d70 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
15d80 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
15d90 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
15da0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
15db0 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
15dc0 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
15dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15de0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
15df0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
15e00 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
15e10 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
15e20 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
15e30 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
15e40 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
15e50 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15e60 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
15e70 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
15e80 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
15e90 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
15ea0 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
15eb0 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
15ec0 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
15ed0 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
15ee0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
15ef0 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
15f00 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
15f10 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
15f20 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
15f30 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
15f40 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
15f50 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
15f60 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
15f70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
15f80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15f90 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
15fa0 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
15fb0 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
15fc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
15fd0 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
15fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15ff0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
16000 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
16010 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
16020 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
16030 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
16040 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
16050 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
16060 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
16070 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
16080 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
16090 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
160a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
160b0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
160c0 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
160d0 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
160e0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
160f0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
16100 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
16110 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
16120 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
16130 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
16140 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
16150 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
16160 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
16170 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
16180 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
16190 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
161a0 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
161b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
161c0 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
161d0 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
161e0 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
161f0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
16200 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
16210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16220 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
16230 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
16240 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
16250 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
16260 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
16270 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16280 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
16290 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
162a0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
162b0 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
162c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
162d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
162e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
162f0 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
16300 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
16310 65 64 20 62 79 20 62 65 66 6f 72 65 20 64 75 72  ed by before dur
16320 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
16330 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
16340 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
16350 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
16360 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
16370 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
16380 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
16390 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
163a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
163b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
163c0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
163d0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
163e0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
163f0 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
16400 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
16410 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
16420 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
16430 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
16440 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
16450 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
16460 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
16470 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
16480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
16490 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
164a0 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
164b0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
164c0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
164d0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
164e0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
164f0 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
16500 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
16510 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
16520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16530 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
16540 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
16550 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
16560 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
16570 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
16580 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
16590 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
165a0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
165b0 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
165c0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
165d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
165e0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
165f0 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
16600 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
16610 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
16620 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
16630 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
16640 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
16650 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
16660 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16670 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16680 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16690 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
166a0 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
166b0 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
166c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
166d0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
166e0 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
166f0 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16700 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
16710 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
16720 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
16730 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
16740 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
16750 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
16760 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16770 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16780 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16790 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
167a0 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
167b0 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
167c0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
167d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
167e0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
167f0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16800 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
16810 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16820 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
16830 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
16840 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
16850 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
16860 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16870 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16880 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16890 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
168a0 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
168b0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
168c0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
168d0 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
168e0 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
168f0 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16900 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
16910 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
16920 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
16930 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
16940 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
16950 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
16960 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16970 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16980 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16990 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
169a0 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
169b0 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
169c0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
169d0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
169e0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
169f0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16a00 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
16a10 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
16a20 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
16a30 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
16a40 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
16a50 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
16a60 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16a70 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16a80 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16a90 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16aa0 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16ab0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16ac0 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16ad0 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16ae0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16af0 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16b00 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
16b10 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
16b20 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
16b30 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16b40 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
16b50 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
16b60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16b70 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16b80 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16b90 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16ba0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16bb0 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16bc0 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16bd0 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16be0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
16bf0 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
16c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
16c10 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
16c20 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
16c30 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
16c40 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
16c50 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
16c60 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
16c70 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
16c80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
16c90 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
16ca0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
16cb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16cc0 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
16cd0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
16ce0 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
16cf0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
16d00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
16d10 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b  pPg || !MEMDB );
16d20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
16d30 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
16d40 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20  _OPEN || pPg==0 
16d50 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
16d60 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
16d70 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16d80 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
16d90 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
16da0 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
16db0 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
16dc0 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29  >pageSize, (u8*)
16dd0 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20  aData),.        
16de0 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
16df0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
16e00 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
16e10 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  );.  if( isMainJ
16e20 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e  rnl ){.    isSyn
16e30 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f  ced = pPager->no
16e40 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65  Sync || (*pOffse
16e50 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  t <= pPager->jou
16e60 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73  rnalHdr);.  }els
16e70 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  e{.    isSynced 
16e80 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  = (pPg==0 || 0==
16e90 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47  (pPg->flags & PG
16ea0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b  HDR_NEED_SYNC));
16eb0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65  .  }.  if( isOpe
16ec0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
16ed0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
16ee0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16ef0 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
16f00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
16f10 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53  _OPEN).   && isS
16f20 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69  ynced.  ){.    i
16f30 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d  64 ofst = (pgno-
16f40 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16f50 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65  pageSize;.    te
16f60 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70  stcase( !isSavep
16f70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20  nt && pPg!=0 && 
16f80 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
16f90 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20  R_NEED_SYNC)!=0 
16fa0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
16fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
16fc0 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  er) );.    rc = 
16fd0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
16fe0 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
16ff0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
17000 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
17010 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
17020 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
17030 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17040 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
17050 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
17060 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
17070 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
17080 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
17090 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
170a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
170b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
170c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
170d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
170e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
170f0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
17100 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
17110 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
17120 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
17130 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
17140 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
17150 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
17160 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
17170 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
17180 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
17190 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
171a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
171b0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
171c0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
171d0 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
171e0 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
171f0 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
17200 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
17210 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
17220 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
17230 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
17240 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
17250 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
17260 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
17270 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
17280 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
17290 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
172a0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
172b0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
172c0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
172d0 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
172e0 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
172f0 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
17300 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
17310 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
17320 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
17330 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
17340 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
17350 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17360 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
17370 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
17380 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
17390 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
173a0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
173b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
173c0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
173d0 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
173e0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
173f0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
17400 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
17410 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
17420 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
17430 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
17440 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
17450 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
17460 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
17470 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
17480 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
17490 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
174a0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
174b0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
174c0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
174d0 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65  epnt );.    asse
174e0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
174f0 74 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  tSpill==0 );.   
17500 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
17510 69 6c 6c 2b 2b 3b 0a 20 20 20 20 72 63 20 3d 20  ill++;.    rc = 
17520 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17530 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
17540 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
17550 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17560 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 31 20 29 3b  doNotSpill==1 );
17570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17580 6f 74 53 70 69 6c 6c 2d 2d 3b 0a 20 20 20 20 69  otSpill--;.    i
17590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
175a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
175b0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
175c0 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
175d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
175e0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
175f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
17600 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
17610 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
17620 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
17630 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
17640 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
17650 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
17660 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
17670 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
17680 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
17690 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
176a0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
176b0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
176c0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
176d0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
176e0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
176f0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
17700 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
17710 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
17720 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
17730 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
17740 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
17750 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
17760 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
17770 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
17780 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
17790 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
177a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
177b0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
177c0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
177d0 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
177e0 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70 50 61 67  | *pOffset<=pPag
177f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20  er->journalHdr) 
17800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
17810 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17820 68 69 73 20 70 61 67 65 20 77 65 72 65 20 6a 75  his page were ju
17830 73 74 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  st restored from
17840 20 74 68 65 20 6d 61 69 6e 20 0a 20 20 20 20 20   the main .     
17850 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
17860 2c 20 74 68 65 6e 20 69 74 73 20 63 6f 6e 74 65  , then its conte
17870 6e 74 20 6d 75 73 74 20 62 65 20 61 73 20 74 68  nt must be as th
17880 65 79 20 77 65 72 65 20 77 68 65 6e 20 74 68 65  ey were when the
17890 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
178a0 61 63 74 69 6f 6e 20 77 61 73 20 66 69 72 73 74  action was first
178b0 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
178c0 20 63 61 73 65 20 77 65 20 63 61 6e 20 6d 61 72   case we can mar
178d0 6b 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  k the page.     
178e0 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c 20 73 69   ** as clean, si
178f0 6e 63 65 20 74 68 65 72 65 20 77 69 6c 6c 20 62  nce there will b
17900 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20 77 72 69  e no need to wri
17910 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74 68 65  te it out to the
17920 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17930 73 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  se..      **.   
17940 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6f     ** There is o
17950 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  ne exception to 
17960 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74 68  this rule. If th
17970 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
17980 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  rolled.      ** 
17990 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66 20  back as part of 
179a0 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72 20  a savepoint (or 
179b0 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62  statement) rollb
179c0 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20  ack from an .   
179d0 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70     ** unsynced p
179e0 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61  ortion of the ma
179f0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  in journal file,
17a00 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
17a10 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  safe.      ** to
17a20 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17a30 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69 73  s clean. This is
17a40 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e 67   because marking
17a50 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20 20   the page as.   
17a60 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c     ** clean will
17a70 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
17a80 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e  _NEED_SYNC flag.
17a90 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 20   Since the page 
17aa0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  is.      ** alre
17ab0 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
17ac0 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64 65  al file (recorde
17ad0 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f  d in Pager.pInJo
17ae0 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20 20  urnal) and.     
17af0 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
17b00 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
17b10 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65 20  cleared, if the 
17b20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
17b30 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  to.      ** agai
17b40 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72  n within this tr
17b50 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77 69  ansaction, it wi
17b60 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ll be marked as 
17b70 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20 20  dirty but.      
17b80 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ** the PGHDR_NEE
17b90 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c  D_SYNC flag will
17ba0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74 20   not be set. It 
17bb0 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e  could then poten
17bc0 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  tially.      ** 
17bd0 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 69  be written out i
17be0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
17bf0 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74 73   file before its
17c00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
17c10 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
17c20 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20 63  s synced. If a c
17c30 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72 69  rash occurs duri
17c40 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  ng or following 
17c50 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64  this,.      ** d
17c60 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
17c70 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20  on may ensue..  
17c80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
17c90 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
17ca0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
17cb0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17cc0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
17cd0 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
17ce0 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
17cf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
17d00 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
17d10 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
17d20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
17d30 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
17d40 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
17d50 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
17d60 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
17d70 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
17d80 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
17d90 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
17da0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
17db0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17dc0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
17dd0 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
17de0 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
17df0 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
17e00 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
17e10 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17e20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
17e30 45 4d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EM);.    sqlite3
17e40 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
17e50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
17e60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
17e70 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
17e80 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
17e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17ea0 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
17eb0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
17ec0 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
17ed0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
17ee0 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
17ef0 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
17f00 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
17f10 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
17f20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
17f30 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
17f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
17f50 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
17f60 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
17f70 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
17f80 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
17f90 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
17fa0 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
17fb0 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
17fc0 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
17fd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
17fe0 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73 74  *.** When a mast
17ff0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18000 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20 69  is created, it i
18010 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
18020 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f   the names .** o
18030 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  f all of its chi
18040 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65  ld journals, one
18050 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c 20   after another, 
18060 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74 66  formatted as utf
18070 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74  -8 .** encoded t
18080 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66 20  ext. The end of 
18090 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
180a0 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b 65  al file is marke
180b0 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c  d with a .** nul
180c0 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
180d0 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74 68   (0x00). i.e. th
180e0 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
180f0 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  s of a master jo
18100 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f  urnal.** file fo
18110 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
18120 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61  involving two da
18130 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62 65  tabases might be
18140 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65  :.**.**   "/home
18150 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e  /bill/a.db-journ
18160 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c  al\x00/home/bill
18170 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30  /b.db-journal\x0
18180 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65  0".**.** A maste
18190 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  r journal file m
181a0 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74  ay only be delet
181b0 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69  ed once all of i
181c0 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75  ts child .** jou
181d0 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e 20  rnals have been 
181e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
181f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18200 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74 65   reads the conte
18210 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  nts of the maste
18220 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r-journal file i
18230 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  nto .** memory a
18240 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  nd loops through
18250 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68 69   each of the chi
18260 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73  ld journal names
18270 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68  . For.** each ch
18280 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ild journal, it 
18290 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a  checks if:.**.**
182a0 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
182b0 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  d journal exists
182c0 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20  , and if so.**  
182d0 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20   * if the child 
182e0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
182f0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18300 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a  master journal .
18310 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61 73  **     file zMas
18320 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63  ter.**.** If a c
18330 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
18340 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20 6d   be found that m
18350 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20 74  atches both of t
18360 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20 61  he criteria.** a
18370 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63 74  bove, this funct
18380 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74 68  ion returns with
18390 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
183a0 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ng. Otherwise, i
183b0 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68 69  f.** no such chi
183c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  ld journal can b
183d0 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d  e found, file zM
183e0 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65 64  aster is deleted
183f0 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c   from.** the fil
18400 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20 73  e-system using s
18410 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
18420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
18430 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74 68   error within th
18440 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20  is function, an 
18450 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18460 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
18470 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
18480 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c  es memory by cal
18490 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ling sqlite3Mall
184a0 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f  oc(). If an allo
184b0 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c  cation.** fails,
184c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
184d0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
184e0 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f  wise, if no IO o
184f0 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
18500 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49 54  .** occur, SQLIT
18510 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18520 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68  ..**.** TODO: Th
18530 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  is function allo
18540 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  cates a single b
18550 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
18560 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e  o load.** the en
18570 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
18580 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
18590 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
185a0 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75  ould be.** a cou
185b0 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73  ple of kilobytes
185c0 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69   or so - potenti
185d0 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ally larger than
185e0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73 69   the page .** si
185f0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
18600 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
18610 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
18630 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ster){.  sqlite3
18640 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
18650 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
18660 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
18670 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18680 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
18690 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
186a0 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64  ;    /* Malloc'd
186b0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
186c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
186d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
186e0 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f  e *pJournal;   /
186f0 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64  * Malloc'd child
18700 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18710 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68  scriptor */.  ch
18720 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
18730 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
18740 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
18750 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
18760 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
18770 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
18780 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
18790 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
187a0 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20  ar *zJournal;   
187b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
187c0 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61  er to one journa
187d0 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65  l within MJ file
187e0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
187f0 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20  terPtr;         
18800 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  /* Space to hold
18810 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f   MJ filename fro
18820 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  m a journal file
18830 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
18840 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  rPtr;           
18850 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61  /* Amount of spa
18860 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  ce allocated to 
18870 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a  zMasterPtr[] */.
18880 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
18890 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68  pace for both th
188a0 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70  e pJournal and p
188b0 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73 63  Master file desc
188c0 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66  riptors..  ** If
188d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65   successful, ope
188e0 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
188f0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65  rnal file for re
18900 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d  ading..  */.  pM
18910 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33  aster = (sqlite3
18920 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d  _file *)sqlite3M
18930 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e  allocZero(pVfs->
18940 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
18950 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
18960 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
18970 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
18980 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
18990 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
189a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
189b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
189c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
189d0 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
189e0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
189f0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
18a00 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
18a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
18a20 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
18a30 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
18a40 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
18a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
18a60 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
18a70 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
18a80 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
18a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
18aa0 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
18ab0 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
18ac0 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
18ad0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
18ae0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
18af0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
18b00 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
18b10 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
18b20 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
18b30 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
18b40 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
18b50 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
18b60 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
18b70 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
18b80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18b90 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
18ba0 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
18bb0 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
18bc0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
18bd0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
18be0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
18bf0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
18c00 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
18c10 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
18c20 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  c((int)nMasterJo
18c30 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
18c40 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
18c50 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
18c60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18c70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
18c80 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
18c90 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
18ca0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
18cb0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
18cc0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
18cd0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
18ce0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
18cf0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
18d00 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
18d10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d20 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
18d30 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
18d40 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
18d50 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
18d60 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
18d70 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
18d80 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
18d90 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
18da0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
18db0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
18dc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18dd0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
18de0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18df0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
18e00 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
18e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
18e30 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
18e40 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
18e50 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
18e60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
18e70 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
18e80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
18e90 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
18ea0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
18eb0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
18ec0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
18ed0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
18ee0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
18ef0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
18f00 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
18f10 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18f20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
18f30 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
18f40 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
18f50 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
18f60 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
18f70 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
18f80 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
18f90 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
18fa0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
18fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18fd0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
18fe0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
18ff0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19000 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19010 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19020 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19040 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19050 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19070 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19080 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19090 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
190a0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
190b0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
190c0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
190d0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
190e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
190f0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19100 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19130 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19150 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19160 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19170 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19180 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19190 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
191a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
191b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
191c0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
191d0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
191e0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
191f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19200 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19210 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19220 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19230 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19240 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19250 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19260 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19270 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19280 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19290 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
192a0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
192b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
192c0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
192d0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
192e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
192f0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19300 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19310 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19330 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19340 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19350 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19360 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19370 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19380 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19390 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
193a0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
193b0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
193c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
193d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
193e0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
193f0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19400 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19410 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19420 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19430 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19440 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19450 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19460 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19470 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19480 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19490 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
194a0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
194b0 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
194c0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
194d0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
194e0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
194f0 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
19500 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
19510 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
19520 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
19530 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
19540 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
19550 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
19560 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
19570 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
19580 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
19590 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
195a0 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
195b0 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
195c0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
195d0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
195e0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
195f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
19600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
19610 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
19620 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
19630 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
19640 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
19650 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
19660 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
19670 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
19680 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
19690 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
196a0 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
196b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
196c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
196d0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
196e0 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
196f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
19700 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e!=PAGER_READER 
19710 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70  );.  .  if( isOp
19720 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a  en(pPager->fd) .
19730 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19740 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
19750 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
19760 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
19770 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20  ER_OPEN) .  ){. 
19780 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
19790 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
197a0 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50   int szPage = pP
197b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
197c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
197d0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
197e0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
197f0 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20   /* TODO: Is it 
19800 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65  safe to use Page
19810 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72  r.dbFileSize her
19820 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  e? */.    rc = s
19830 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19840 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75  (pPager->fd, &cu
19850 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20  rrentSize);.    
19860 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  newSize = szPage
19870 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
19880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19890 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
198a0 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
198b0 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
198c0 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
198d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
198e0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
198f0 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
19900 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e);.      }else 
19910 69 66 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65  if( (currentSize
19920 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a  +szPage)<=newSiz
19930 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  e ){.        cha
19940 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72  r *pTmp = pPager
19950 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
19960 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70       memset(pTmp
19970 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20  , 0, szPage);.  
19980 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19990 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29  (newSize-szPage)
199a0 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20   == currentSize 
199b0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
199c0 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a  ase( (newSize-sz
199d0 50 61 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74  Page) >  current
199e0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
199f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
19a00 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
19a10 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65  pTmp, szPage, ne
19a20 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20  wSize-szPage);. 
19a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19a50 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19a60 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
19a70 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Page;.      }.  
19a80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19aa0 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64  turn a sanitized
19ab0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
19ac0 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f  sector-size of O
19ad0 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68  S file pFile. Th
19ae0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  e.** return valu
19af0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
19b00 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33  to lie between 3
19b10 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52  2 and MAX_SECTOR
19b20 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _SIZE..*/.int sq
19b30 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28  lite3SectorSize(
19b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
19b50 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74  ile){.  int iRet
19b60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
19b70 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20  orSize(pFile);. 
19b80 20 69 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a   if( iRet<32 ){.
19b90 20 20 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a      iRet = 512;.
19ba0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74    }else if( iRet
19bb0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
19bc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19bd0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e  MAX_SECTOR_SIZE>
19be0 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74  =512 );.    iRet
19bf0 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
19c00 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ZE;.  }.  return
19c10 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iRet;.}../*.** 
19c20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  Set the value of
19c30 20 74 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   the Pager.secto
19c40 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66  rSize variable f
19c50 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
19c60 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74  pager based on t
19c70 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
19c80 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72  d by the xSector
19c90 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f  Size method.** o
19ca0 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  f the open datab
19cb0 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65  ase file. The se
19cc0 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
19cd0 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a 2a 20  e used used .** 
19ce0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
19cf0 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d   size and alignm
19d00 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  ent of journal h
19d10 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61  eader and .** ma
19d20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
19d30 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72 65  nters within cre
19d40 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ated journal fil
19d50 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  es..**.** For te
19d60 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68  mporary files th
19d70 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19d80 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79  or size is alway
19d90 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a  s 512 bytes..**.
19da0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f  ** Otherwise, fo
19db0 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20  r non-temporary 
19dc0 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63  files, the effec
19dd0 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
19de0 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   is.** the value
19df0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
19e00 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d   xSectorSize() m
19e10 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70  ethod rounded up
19e20 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20   to 32 if.** it 
19e30 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c  is less than 32,
19e40 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e   or rounded down
19e50 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53   to MAX_SECTOR_S
19e60 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20  IZE if it.** is 
19e70 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58  greater than MAX
19e80 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a  _SECTOR_SIZE..**
19e90 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19ea0 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49  has the SQLITE_I
19eb0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
19ec0 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72 74  VERWRITE propert
19ed0 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74  y, then set.** t
19ee0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
19ef0 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20  tor size to its 
19f00 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35  minimum value (5
19f10 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73  12).  The purpos
19f20 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e  e of.** pPager->
19f30 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f  sectorSize is to
19f40 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61   define the "bla
19f50 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62 79  st radius" of by
19f60 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  tes that.** migh
19f70 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63 72  t change if a cr
19f80 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ash occurs while
19f90 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69   writing to a si
19fa0 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20  ngle byte in.** 
19fb0 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74  that range.  But
19fc0 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f   with POWERSAFE_
19fd0 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20 62  OVERWRITE, the b
19fe0 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20 7a  last radius is z
19ff0 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20  ero.** (that is 
1a000 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f  what POWERSAFE_O
1a010 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c  VERWRITE means),
1a020 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20   so we minimize 
1a030 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69  the sector.** si
1a040 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72  ze.  For backwar
1a050 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
1a060 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1a070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a080 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e  rmat,.** we cann
1a090 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65 66  ot reduce the ef
1a0a0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1a0b0 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a  ize below 512..*
1a0c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1a0d0 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65  tSectorSize(Page
1a0e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
1a0f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1a100 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
1a110 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
1a130 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73  empFile.   || (s
1a140 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a150 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a160 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20  ager->fd) & .   
1a170 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1a180 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1a190 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a  E_OVERWRITE)!=0.
1a1a0 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74    ){.    /* Sect
1a1b0 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20  or size doesn't 
1a1c0 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f  matter for tempo
1a1d0 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f  rary files. Also
1a1e0 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  , the file.    *
1a1f0 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62  * may not have b
1a200 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20  een opened yet, 
1a210 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68  in which case th
1a220 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e OsSectorSize()
1a230 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  .    ** call wil
1a240 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20  l segfault. */. 
1a250 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a260 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
1a270 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
1a280 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
1a290 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65  qlite3SectorSize
1a2a0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a2b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
1a2c0 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
1a2d0 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
1a2e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a2f0 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
1a300 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
1a310 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
1a320 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
1a330 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
1a340 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
1a350 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
1a360 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
1a370 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
1a380 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
1a390 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
1a3a0 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1a3b0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1a3c0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a3d0 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
1a3e0 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
1a3f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
1a400 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
1a410 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
1a420 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
1a430 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
1a440 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
1a450 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
1a460 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
1a470 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1a480 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1a490 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
1a4a0 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
1a4b0 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
1a4c0 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
1a4d0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
1a4e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a4f0 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
1a500 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
1a510 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
1a520 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
1a530 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
1a540 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1a550 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1a560 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
1a570 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
1a580 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
1a590 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1a5a0 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
1a5b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1a5c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
1a5d0 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29  ge size..**  (7)
1a5e0 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f    zero padding o
1a5f0 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ut to the next s
1a600 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20  ector size..**  
1a610 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (8)  Zero or mor
1a620 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
1a630 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
1a640 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
1a650 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
1a660 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
1a670 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
1a680 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
1a690 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
1a6a0 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
1a6b0 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
1a6c0 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
1a6d0 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
1a6e0 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69 74  n the first 7 it
1a6f0 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
1a700 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
1a710 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
1a720 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74  stance of the 8t
1a730 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
1a740 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
1a750 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
1a760 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
1a770 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
1a780 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
1a790 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a7a0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
1a7b0 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
1a7c0 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
1a7d0 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
1a7e0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
1a7f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1a800 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
1a810 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
1a820 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
1a830 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
1a840 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
1a850 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
1a860 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
1a870 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1a880 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
1a890 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
1a8a0 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
1a8b0 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
1a8c0 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
1a8d0 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
1a8e0 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
1a8f0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
1a900 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
1a910 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
1a920 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
1a930 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
1a940 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
1a950 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
1a960 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
1a970 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
1a980 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
1a990 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
1a9a0 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
1a9b0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
1a9c0 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
1a9d0 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
1a9e0 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
1a9f0 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
1aa00 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
1aa10 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
1aa20 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
1aa30 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
1aa40 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
1aa50 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
1aa60 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
1aa70 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
1aa80 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
1aa90 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
1aaa0 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
1aab0 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
1aac0 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
1aad0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
1aae0 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
1aaf0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
1ab00 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
1ab10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
1ab20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
1ab30 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
1ab40 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
1ab50 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1ab60 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
1ab70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1ab80 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
1ab90 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
1aba0 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
1abb0 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
1abc0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
1abd0 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
1abe0 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
1abf0 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
1ac00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
1ac10 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
1ac20 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
1ac30 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
1ac40 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
1ac50 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1ac60 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
1ac70 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61 72  ** The isHot par
1ac80 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1ac90 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72 79   that we are try
1aca0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1acb0 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61  a journal.** tha
1acc0 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74  t might be a hot
1acd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69   journal.  Or, i
1ace0 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20  t could be that 
1acf0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a  the journal is .
1ad00 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65 63  ** preserved bec
1ad10 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d  ause of JOURNALM
1ad20 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a  ODE_PERSIST or J
1ad30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
1ad40 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ATE..** If the j
1ad50 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73  ournal really is
1ad60 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20   hot, reset the 
1ad70 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69 6f  pager cache prio
1ad80 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63  r rolling.** bac
1ad90 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20  k any content.  
1ada0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  If the journal i
1adb0 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74  s merely persist
1adc0 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73  ent, no reset is
1add0 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  .** needed..*/.s
1ade0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1adf0 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
1ae00 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
1ae10 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  t){.  sqlite3_vf
1ae20 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
1ae30 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a  ->pVfs;.  i64 sz
1ae40 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
1ae50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1ae60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1ae70 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
1ae80 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
1ae90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1aea0 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
1aeb0 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
1aec0 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
1aed0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1aee0 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1aef0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
1af00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1af10 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
1af20 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
1af30 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
1af40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af50 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1af60 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
1af70 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  e */.  int res =
1af80 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
1af90 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1afa0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63  d by sqlite3OsAc
1afb0 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72  cess() */.  char
1afc0 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
1afd0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1afe0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1aff0 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  ile if any */.  
1b000 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65 73  int needPagerRes
1b010 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65  et;      /* True
1b020 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20 70   to reset page p
1b030 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61  rior to first pa
1b040 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ge rollback */. 
1b050 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d   int nPlayback =
1b060 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74   0;       /* Tot
1b070 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1b080 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d  es restored from
1b090 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f   journal */..  /
1b0a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1b0b0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
1b0c0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1b0d0 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
1b0e0 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
1b0f0 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
1b100 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
1b110 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1b120 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b130 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
1b140 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
1b150 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b160 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
1b170 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b180 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
1b190 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b1a0 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  name from the jo
1b1b0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
1b1c0 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66  present..  ** If
1b1d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b1e0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73  l file name is s
1b1f0 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68  pecified, but th
1b200 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20  e file is not.  
1b210 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69  ** present on di
1b220 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  sk, then the jou
1b230 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20  rnal is not hot 
1b240 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  and does not nee
1b250 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61  d to be.  ** pla
1b260 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20  yed back..  **. 
1b270 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69   ** TODO: Techni
1b280 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77  cally the follow
1b290 69 6e 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20  ing is an error 
1b2a0 62 65 63 61 75 73 65 20 69 74 20 61 73 73 75 6d  because it assum
1b2b0 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66  es that.  ** buf
1b2c0 66 65 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70  fer Pager.pTmpSp
1b2d0 61 63 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61  ace is (mxPathna
1b2e0 6d 65 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c  me+1) bytes or l
1b2f0 61 72 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74  arger. i.e. that
1b300 0a 20 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70  .  ** (pPager->p
1b310 61 67 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  ageSize >= pPage
1b320 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
1b330 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73  ame+1). Using os
1b340 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d  _unix.c,.  **  m
1b350 78 50 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32  xPathname is 512
1b360 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  , which is the s
1b370 61 6d 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d  ame as the minim
1b380 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c  um allowable val
1b390 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  ue.  ** for page
1b3a0 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61  Size..  */.  zMa
1b3b0 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
1b3c0 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
1b3d0 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
1b3e0 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  al(pPager->jfd, 
1b3f0 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d  zMaster, pPager-
1b400 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1b410 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e+1);.  if( rc==
1b420 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1b430 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72  ster[0] ){.    r
1b440 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1b450 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
1b460 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
1b470 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
1b480 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20    }.  zMaster = 
1b490 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
1b4a0 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29  ITE_OK || !res )
1b4b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1b4c0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
1b4d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b4e0 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67  f = 0;.  needPag
1b4f0 65 72 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b  erReset = isHot;
1b500 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
1b510 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
1b520 65 72 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f  er when a readJo
1b530 75 72 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20  urnalHdr() or . 
1b540 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
1b550 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61  ck_one_page() ca
1b560 6c 6c 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ll returns SQLIT
1b570 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
1b580 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75  error .  ** occu
1b590 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  rs. .  */.  whil
1b5a0 65 28 20 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52  e( 1 ){.    /* R
1b5b0 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
1b5c0 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
1b5d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b5e0 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
1b5f0 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
1b600 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
1b610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b620 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
1b630 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
1b640 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
1b650 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
1b660 73 73 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  ss must have fai
1b670 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
1b680 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
1b690 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
1b6a0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
1b6b0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1b6c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b6d0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
1b6e0 28 70 50 61 67 65 72 2c 20 69 73 48 6f 74 2c 20  (pPager, isHot, 
1b6f0 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
1b700 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1b710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
1b720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b730 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
1b740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b750 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
1b760 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1b770 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
1b780 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
1b790 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
1b7a0 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
1b7b0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
1b7c0 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
1b7d0 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
1b7e0 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
1b7f0 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
1b800 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1b810 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
1b820 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
1b830 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
1b840 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
1b850 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
1b860 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
1b870 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
1b880 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
1b890 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
1b8a0 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
1b8b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b8c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
1b8d0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1b8e0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
1b8f0 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20  ec = (int)((szJ 
1b900 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
1b910 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
1b920 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
1b930 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b940 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
1b950 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
1b960 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
1b970 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
1b980 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
1b990 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
1b9a0 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
1b9b0 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
1b9c0 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
1b9d0 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
1b9e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
1b9f0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
1ba00 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
1ba10 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
1ba20 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
1ba30 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
1ba40 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
1ba50 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
1ba60 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
1ba70 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
1ba80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1ba90 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
1baa0 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
1bab0 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
1bac0 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68  #2565..    ** Wh
1bad0 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
1bae0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e  a hot journal, n
1baf0 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65  Rec==0 always me
1bb00 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ans that the nex
1bb10 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f  t.    ** chunk o
1bb20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f  f the journal co
1bb30 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67 65  ntains zero page
1bb40 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
1bb50 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a  ack.  But.    **
1bb60 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f   when doing a RO
1bb70 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20 6e  LLBACK and the n
1bb80 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20  Rec==0 chunk is 
1bb90 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20 69  the last chunk i
1bba0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
1bbb0 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  rnal, it means t
1bbc0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1bbd0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61 64  might contain ad
1bbe0 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20  ditional.    ** 
1bbf0 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20  pages that need 
1bc00 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
1bc10 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6e  k and that the n
1bc20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 0a  umber of pages .
1bc30 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65      ** should be
1bc40 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64 20   computed based 
1bc50 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
1bc60 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  ile size..    */
1bc70 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
1bc80 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
1bc90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1bca0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
1bcb0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
1bcc0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
1bcd0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
1bce0 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
1bcf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bd00 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
1bd10 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1bd20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1bd30 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1bd40 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
1bd50 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1bd60 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
1bd70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1bd80 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
1bd90 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
1bda0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
1bdb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1bdc0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
1bdd0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1bde0 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
1bdf0 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
1be00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1be10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1be20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1be30 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
1be40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1be50 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
1be60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
1be70 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
1be80 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
1be90 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
1bea0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
1beb0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
1bec0 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
1bed0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
1bee0 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
1bef0 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
1bf00 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
1bf10 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1bf20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1bf30 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1bf40 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1bf50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1bf60 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1bf70 70 50 61 67 65 72 2c 26 70 50 61 67 65 72 2d 3e  pPager,&pPager->
1bf80 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30  journalOff,0,1,0
1bf90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1bfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bfb0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b        nPlayback+
1bfc0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
1bfd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1bfe0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1bff0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1c000 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
1c010 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
1c020 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1c030 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
1c040 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1c050 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  D ){.          /
1c060 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c070 20 68 61 73 20 62 65 65 6e 20 74 72 75 6e 63 61   has been trunca
1c080 74 65 64 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70  ted, simply stop
1c090 20 72 65 61 64 69 6e 67 20 61 6e 64 0a 20 20 20   reading and.   
1c0a0 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
1c0b0 73 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sing the journal
1c0c0 2e 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70  . This might hap
1c0d0 70 65 6e 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  pen if the journ
1c0e0 61 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 20  al was.         
1c0f0 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   ** not complete
1c100 6c 79 20 77 72 69 74 74 65 6e 20 61 6e 64 20 73  ly written and s
1c110 79 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 61  ynced prior to a
1c120 20 63 72 61 73 68 2e 20 20 49 6e 20 74 68 61 74   crash.  In that
1c130 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1c140 73 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  se, the database
1c150 20 73 68 6f 75 6c 64 20 68 61 76 65 20 6e 65 76   should have nev
1c160 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
1c170 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
1c180 20 2a 2a 20 66 69 72 73 74 20 70 6c 61 63 65 20   ** first place 
1c190 73 6f 20 69 74 20 69 73 20 4f 4b 20 74 6f 20 73  so it is OK to s
1c1a0 69 6d 70 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68  imply abandon th
1c1b0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20  e rollback. */. 
1c1c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1c1d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
1c1e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c1f0 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  back;.        }e
1c200 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
1c210 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
1c220 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
1c230 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
1c240 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
1c250 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
1c260 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
1c270 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
1c280 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1c290 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
1c2a0 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
1c2b0 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
1c2c0 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
1c2d0 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
1c2e0 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
1c2f0 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
1c300 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
1c310 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
1c320 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
1c330 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1c340 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1c350 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c360 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
1c370 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
1c380 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
1c390 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
1c3a0 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
1c3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c3c0 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
1c3d0 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
1c3e0 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
1c3f0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
1c400 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1c410 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
1c420 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
1c430 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
1c440 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
1c450 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
1c460 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
1c470 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
1c480 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
1c490 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
1c4a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c4b0 44 45 42 55 47 0a 20 20 69 66 28 20 70 50 61 67  DEBUG.  if( pPag
1c4c0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1c4d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
1c4e0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
1c4f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49  (pPager->fd,SQLI
1c500 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1c510 41 4e 47 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65  ANGED,0);.  }.#e
1c520 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
1c530 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68  is playback is h
1c540 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74  appening automat
1c550 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75  ically as a resu
1c560 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a  lt of an IO or .
1c570 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f    ** malloc erro
1c580 72 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20  r that occurred 
1c590 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
1c5a0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
1c5b0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
1c5c0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
1c5d0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
1c5e0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
1c5f0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
1c600 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
1c610 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
1c620 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
1c630 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
1c640 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
1c650 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
1c660 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
1c670 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
1c680 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
1c690 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
1c6a0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
1c6b0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
1c6c0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
1c6d0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
1c6e0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
1c6f0 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
1c700 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
1c710 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
1c720 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
1c730 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
1c740 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
1c750 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
1c760 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
1c770 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
1c780 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
1c790 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1c7a0 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e;..  if( rc==SQ
1c7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a  LITE_OK ){.    z
1c7c0 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d  Master = pPager-
1c7d0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
1c7e0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1c7f0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1c800 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1c810 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1c820 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65  hname+1);.    te
1c830 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c840 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c850 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c860 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
1c870 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
1c880 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50  ITER_DBMOD || pP
1c890 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1c8a0 47 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20  GER_OPEN).  ){. 
1c8b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c8c0 61 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 29  agerSync(pPager)
1c8d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1c8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c8f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1c900 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1c910 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1c920 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1c930 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1c940 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1c950 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c960 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1c970 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1c980 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1c990 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1c9a0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1c9b0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1c9c0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1c9d0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1c9e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1c9f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1ca00 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1ca10 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1ca20 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1ca30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1ca40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1ca50 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1ca60 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1ca70 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1ca80 53 51 4c 49 54 45 5f 4f 4b 2c 20 22 52 65 63 6f  SQLITE_OK, "Reco
1ca90 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20 66  vered %d pages f
1caa0 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20  rom %s",.       
1cab0 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61           nPlayba
1cac0 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ck, pPager->zJou
1cad0 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rnal);.  }..  /*
1cae0 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
1caf0 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
1cb00 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
1cb10 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
1cb20 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
1cb30 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
1cb40 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
1cb50 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
1cb60 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
1cb70 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
1cb80 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
1cb90 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
1cba0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
1cbb0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1cbc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cbd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  }.../*.** Read t
1cbe0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70  he content for p
1cbf0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
1cc00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cc10 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50   and into .** pP
1cc20 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72  g->pData. A shar
1cc30 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74  ed lock or great
1cc40 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  er must be held 
1cc50 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  on the database.
1cc60 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
1cc70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cc80 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
1cc90 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64 2c   page 1 is read,
1cca0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
1ccb0 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
1ccc0 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a  ers[] is set to.
1ccd0 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ** the value rea
1cce0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
1ccf0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1cd00 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
1cd10 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1cd20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  IO error is retu
1cd30 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1cd40 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  er..** Otherwise
1cd50 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1cd60 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1cd70 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67  ic int readDbPag
1cd80 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33  e(PgHdr *pPg, u3
1cd90 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67  2 iFrame){.  Pag
1cda0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1cdb0 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67  ->pPager; /* Pag
1cdc0 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  er object associ
1cdd0 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70  ated with page p
1cde0 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  Pg */.  Pgno pgn
1cdf0 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20  o = pPg->pgno;  
1ce00 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1ce10 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  ber to read */. 
1ce20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ce30 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
1ce40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1ce50 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61    int pgsz = pPa
1ce60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f  ger->pageSize; /
1ce70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1ce80 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20  s to read */..  
1ce90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cea0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1ceb0 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1cec0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1ced0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1cee0 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 21  ;..  if( NEVER(!
1cef0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1cf00 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  d)) ){.    asser
1cf10 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
1cf20 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ile );.    memse
1cf30 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
1cf40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cf50 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1cf60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1cf70 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20   if( iFrame ){. 
1cf80 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c     /* Try to pul
1cf90 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  l the page from 
1cfa0 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 20  the write-ahead 
1cfb0 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  log. */.    rc =
1cfc0 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1cfd0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1cfe0 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c  l, iFrame, pgsz,
1cff0 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pPg->pData);.  
1d000 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 69  }else{.    i64 i
1d010 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
1d020 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1d030 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
1d040 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1d050 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
1d060 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69 4f  >pData, pgsz, iO
1d070 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
1d080 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1d090 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1d0a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1d0b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1d0c0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1d0d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1d0e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1d0f0 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1d100 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1d110 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1d120 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1d130 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1d140 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1d150 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1d160 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1d170 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1d180 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1d190 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1d1a0 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1d1b0 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1d1c0 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1d1d0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1d1e0 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1d1f0 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1d200 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1d210 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1d220 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1d230 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1d240 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1d250 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1d260 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1d270 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1d280 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1d290 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d2a0 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1d2b0 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1d2c0 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1d2d0 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1d2e0 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1d2f0 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1d300 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1d310 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1d320 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1d330 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e   ** white noisin
1d340 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79  g equaling 16 by
1d350 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20 76  tes of 0xff is v
1d360 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
1d370 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20   so.      ** we 
1d380 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20  should still be 
1d390 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ok..      */.   
1d3a0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72     memset(pPager
1d3b0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78  ->dbFileVers, 0x
1d3c0 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  ff, sizeof(pPage
1d3d0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1d3e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d3f0 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
1d400 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
1d410 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20  Data)[24];.     
1d420 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1d430 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1d440 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1d450 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d460 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rs));.    }.  }.
1d470 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1d480 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e   pPg->pData, pgn
1d490 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54  o, 3, rc = SQLIT
1d4a0 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47  E_NOMEM);..  PAG
1d4b0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1d4c0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
1d4d0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
1d4e0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
1d4f0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
1d500 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
1d510 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50  ger, pgno));.  P
1d520 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54 43  AGERTRACE(("FETC
1d530 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
1d540 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1d550 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1d560 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1d570 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1d580 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75  (pPg)));..  retu
1d590 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d5a0 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65  Update the value
1d5b0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
1d5c0 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74  ounter at offset
1d5d0 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a  s 24 and 92 in.*
1d5e0 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  * the header and
1d5f0 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73   the sqlite vers
1d600 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
1d610 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54  fset 96..**.** T
1d620 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64  his is an uncond
1d630 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20  itional update. 
1d640 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61   See also the pa
1d650 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1d660 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74  ounter().** rout
1d670 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75  ine which only u
1d680 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1d690 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65  e-counter if the
1d6a0 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61   update is actua
1d6b0 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61  lly.** needed, a
1d6c0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1d6d0 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
1d6e0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74  geCountDone stat
1d6f0 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1d700 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1d710 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1d720 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29  nter(PgHdr *pPg)
1d730 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  {.  u32 change_c
1d740 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e  ounter;..  /* In
1d750 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1d760 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1d770 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1d780 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1d790 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1d7a0 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1d7b0 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72  (u8*)pPg->pPager
1d7c0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b  ->dbFileVers)+1;
1d7d0 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1d7e0 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1d7f0 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1d800 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ter);..  /* Also
1d810 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
1d820 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d830 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
1d840 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74   and in.  ** byt
1d850 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
1d860 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1d870 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1d880 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
1d890 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
1d8a0 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  /.  put32bits(((
1d8b0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d8c0 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+92, change_cou
1d8d0 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69  nter);.  put32bi
1d8e0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1d8f0 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
1d900 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
1d910 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1d920 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1d930 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d940 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1d950 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1d960 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1d970 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1d980 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1d990 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1d9a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1d9b0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1d9c0 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1d9d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1d9e0 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1d9f0 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1da00 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1da10 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1da20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1da30 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1da40 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1da50 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1da60 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1da70 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1da80 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1da90 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1daa0 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1dab0 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1dac0 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1dad0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1dae0 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1daf0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1db00 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1db10 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1db20 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1db30 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1db40 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1db50 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1db60 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1db70 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1db80 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1db90 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1dba0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1dbb0 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1dbc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1dbd0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1dbe0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1dbf0 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1dc00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ;..  assert( pag
1dc10 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1dc20 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69   );.  pPg = sqli
1dc30 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
1dc40 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69  Pager, iPg);.  i
1dc50 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66  f( pPg ){.    if
1dc60 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1dc70 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29  ageRefcount(pPg)
1dc80 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1dc90 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
1dca0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
1dcb0 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d 65        u32 iFrame
1dcc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1dcd0 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46   sqlite3WalFindF
1dce0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1dcf0 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69  l, pPg->pgno, &i
1dd00 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
1dd10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dd20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1dd30 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c 20  readDbPage(pPg, 
1dd40 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  iFrame);.      }
1dd50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1dd60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dd70 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1dd80 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
1dd90 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1dda0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1ddb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1ddc0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1ddd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1dde0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
1ddf0 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
1de00 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
1de10 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
1de20 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
1de30 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1de40 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
1de50 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
1de60 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
1de70 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
1de80 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
1de90 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
1dea0 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
1deb0 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
1dec0 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
1ded0 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
1dee0 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
1def0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1df00 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1df10 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
1df20 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
1df30 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
1df40 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
1df50 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
1df60 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
1df70 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
1df80 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
1df90 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
1dfa0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
1dfb0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
1dfc0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1dfd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1dfe0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1dff0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
1e000 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
1e010 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
1e020 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e030 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
1e040 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1e050 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e070 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1e080 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
1e0b0 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
1e0c0 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
1e0d0 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
1e0e0 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
1e0f0 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
1e100 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
1e110 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
1e120 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
1e130 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
1e140 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
1e150 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
1e160 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
1e170 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
1e180 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
1e190 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
1e1a0 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
1e1b0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
1e1c0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
1e1d0 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
1e1e0 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
1e1f0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1e200 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
1e210 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
1e220 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
1e230 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
1e240 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
1e250 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
1e260 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1e270 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1e280 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
1e290 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
1e2a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
1e2b0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
1e2c0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
1e2d0 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
1e2e0 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
1e2f0 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
1e300 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
1e310 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
1e320 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e330 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e340 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
1e350 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
1e360 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
1e370 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
1e380 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1e390 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
1e3a0 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
1e3b0 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
1e3c0 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
1e3d0 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
1e3e0 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
1e3f0 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
1e400 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
1e410 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
1e420 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f  **.** The list o
1e430 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20 69  f pages passed i
1e440 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
1e450 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65   is always sorte
1e460 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  d by page number
1e470 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70  ..** Hence, if p
1e480 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61 6e  age 1 appears an
1e490 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69  ywhere on the li
1e4a0 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74  st, it will be t
1e4b0 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a  he first page..*
1e4c0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  / .static int pa
1e4d0 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20  gerWalFrames(.  
1e4e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1e510 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73  */.  PgHdr *pLis
1e520 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1e530 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
1e540 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f  frames to log */
1e550 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74  .  Pgno nTruncat
1e560 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1e570 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1e580 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20 63  ize after this c
1e590 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ommit */.  int i
1e5a0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1e5b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e5c0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e5d0 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69  commit */.){.  i
1e5e0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e600 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e610 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20  .  int nList;   
1e620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e630 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e640 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a  pages in pList *
1e650 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1e660 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1e670 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 48  efined(SQLITE_CH
1e680 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67 48  ECK_PAGES).  PgH
1e690 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e6b0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1e6c0 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69 66   pages */.#endif
1e6d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1e6e0 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73  er->pWal );.  as
1e6f0 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23  sert( pList );.#
1e700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1e710 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  UG.  /* Verify t
1e720 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69 73  hat the page lis
1e730 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  t is in accendin
1e740 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72  g order */.  for
1e750 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70  (p=pList; p && p
1e760 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70  ->pDirty; p=p->p
1e770 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65  Dirty){.    asse
1e780 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d  rt( p->pgno < p-
1e790 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b  >pDirty->pgno );
1e7a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1e7b0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44  ssert( pList->pD
1e7c0 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d  irty==0 || isCom
1e7d0 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43  mit );.  if( isC
1e7e0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  ommit ){.    /* 
1e7f0 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63  If a WAL transac
1e800 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f  tion is being co
1e810 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20 69  mmitted, there i
1e820 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72  s no point in wr
1e830 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79  iting.    ** any
1e840 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65   pages with page
1e850 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
1e860 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20   than nTruncate 
1e870 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  into the WAL fil
1e880 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77  e..    ** They w
1e890 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61  ill never be rea
1e8a0 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e  d by any client.
1e8b0 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20   So remove them 
1e8c0 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a  from the pDirty.
1e8d0 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65      ** list here
1e8e0 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a  . */.    PgHdr *
1e8f0 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  p;.    PgHdr **p
1e900 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1e910 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
1e920 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1e930 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1e940 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e950 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1e960 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1e970 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1e980 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1e990 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1e9a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e9b0 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1e9c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1e9d0 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1e9e0 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1e9f0 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1ea00 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1ea10 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1ea20 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1ea30 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1ea40 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1ea50 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1ea60 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1ea70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ea80 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1ea90 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1eaa0 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1eab0 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1eac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1ead0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1eae0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a  {.    PgHdr *p;.
1eaf0 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1eb00 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1eb10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1eb20 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1eb30 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1eb40 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1eb50 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1eb60 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1eb70 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1eb80 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1eb90 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1eba0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1ebb0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1ebc0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1ebd0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1ebe0 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1ebf0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1ec00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1ec10 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1ec20 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1ec30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ec40 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1ec50 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1ec60 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1ec70 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1ec80 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1ec90 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1eca0 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1ecb0 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1ecc0 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1ecd0 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1ece0 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1ecf0 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1ed00 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1ed10 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1ed20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1ed30 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1ed40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ed50 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1ed60 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1ed70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1ed80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1eda0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1edb0 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1edd0 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1ede0 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1edf0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1ee00 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1ee10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1ee20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1ee30 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1ee40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1ee50 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1ee60 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1ee70 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1ee80 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1ee90 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1eea0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1eeb0 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1eec0 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1eed0 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1eee0 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1eef0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1ef00 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1ef10 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1ef20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1ef30 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1ef40 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1ef50 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1ef60 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1ef70 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1ef80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1ef90 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1efa0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1efb0 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1efc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1efd0 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1efe0 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1eff0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1f000 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
1f010 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
1f020 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
1f030 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
1f040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f050 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1f060 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f070 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  led as part of t
1f080 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72  he transition fr
1f090 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  om PAGER_OPEN.**
1f0a0 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
1f0b0 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d   state to determ
1f0c0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
1f0d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f0e0 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61  e.** in pages (a
1f0f0 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65  ssuming the page
1f100 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20   size currently 
1f110 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
1f120 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a  pageSize)..**.**
1f130 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
1f140 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
1f150 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1f160 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f170 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61  atabase.** in pa
1f180 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ges is stored in
1f190 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77   *pnPage. Otherw
1f1a0 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
1f1b0 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53  de (perhaps.** S
1f1c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1f1d0 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  T) is returned a
1f1e0 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
1f1f0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  ft unmodified..*
1f200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f210 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
1f220 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1f230 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
1f240 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1f250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f260 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1f270 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1f280 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41   /* Query the WA
1f290 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72  L sub-system for
1f2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f2b0 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a  ze. The WalDbsiz
1f2c0 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e().  ** functio
1f2d0 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69  n returns zero i
1f2e0 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
1f2f0 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65   open (i.e. Page
1f300 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20  r.pWal==0), or. 
1f310 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62   ** if the datab
1f320 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ase size is not 
1f330 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64  available. The d
1f340 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f350 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  not.  ** availab
1f360 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1f370 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68  sub-system if th
1f380 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d  e log file is em
1f390 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74  pty or.  ** cont
1f3a0 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f  ains no valid co
1f3b0 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
1f3c0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
1f3d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f3e0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f400 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1f410 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61  ED_LOCK );.  nPa
1f420 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44  ge = sqlite3WalD
1f430 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1f440 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  al);..  /* If th
1f450 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1f460 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  was not availabl
1f470 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73  e from the WAL s
1f480 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20  ub-system,.  ** 
1f490 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62 61 73  determine it bas
1f4a0 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
1f4b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f4c0 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69 7a 65  ile. If the size
1f4d0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  .  ** of the dat
1f4e0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f  abase file is no
1f4f0 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c  t an integer mul
1f500 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
1f510 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72 6f 75  e-size,.  ** rou
1f520 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6e  nd down to the n
1f530 65 61 72 65 73 74 20 70 61 67 65 2e 20 45 78 63  earest page. Exc
1f540 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 6c 61  ept, any file la
1f550 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20 2a 2a  rger than 0.  **
1f560 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 69   bytes in size i
1f570 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  s considered to 
1f580 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61 73 74  contain at least
1f590 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a   one page..  */.
1f5a0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
1f5b0 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  {.    i64 n = 0;
1f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
1f5e0 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  b file in bytes 
1f5f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
1f600 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1f610 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1f620 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1f630 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1f640 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  fd) ){.      int
1f650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1f660 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1f670 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 69  fd, &n);.      i
1f680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f690 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1f6a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1f6b0 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d     }.    nPage =
1f6c0 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65   (Pgno)((n+pPage
1f6d0 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f  r->pageSize-1) /
1f6e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1f6f0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
1f700 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1f710 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1f720 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1f730 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a  ter than the.  *
1f740 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78  * configured max
1f750 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65  imum pager numbe
1f760 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  r, increase the 
1f770 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f  allowed limit so
1f780 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66  .  ** that the f
1f790 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e  ile can be read.
1f7a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1f7b0 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  e>pPager->mxPgno
1f7c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1f7d0 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
1f7e0 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e  Page;.  }..  *pn
1f7f0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1f800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f810 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1f820 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
1f830 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20  ** Check if the 
1f840 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20  *-wal file that 
1f850 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
1f860 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1f870 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20  ed by pPager.** 
1f880 65 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61  exists if the da
1f890 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d  tabase is not em
1f8a0 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68  py, or verify th
1f8b0 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  at the *-wal fil
1f8c0 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  e does.** not ex
1f8d0 69 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67  ist (by deleting
1f8e0 20 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61   it) if the data
1f8f0 62 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70  base file is emp
1f900 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
1f910 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
1f920 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a   empty and the *
1f930 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  -wal file exists
1f940 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72  , open the pager
1f950 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  .** in WAL mode.
1f960 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1f970 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66  e is empty or if
1f980 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65   no *-wal file e
1f990 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20  xists and.** if 
1f9a0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1f9b0 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72   make sure Pager
1f9c0 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20  .journalMode is 
1f9d0 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41  not set to.** PA
1f9e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1f9f0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  WAL..**.** Retur
1fa00 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61  n SQLITE_OK or a
1fa10 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  n error code..**
1fa20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1fa30 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45  ust hold a SHARE
1fa40 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
1fa50 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
1fa60 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  all this.** func
1fa70 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e  tion. Because an
1fa80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1fa90 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69  on the db file i
1faa0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65  s required to de
1fab0 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f  lete .** a WAL o
1fac0 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64  n a none-empty d
1fad0 61 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e  atabase, this en
1fae0 73 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e  sures there is n
1faf0 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  o race condition
1fb00 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65   .** between the
1fb10 20 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77   xAccess() below
1fb20 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28   and an xDelete(
1fb30 29 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64  ) being executed
1fb40 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68   by some .** oth
1fb50 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  er connection..*
1fb60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1fb70 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
1fb80 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1fb90 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1fba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1fbb0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1fbc0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
1fbd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1fbe0 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44  r->eLock>=SHARED
1fbf0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20  _LOCK );..  if( 
1fc00 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1fc10 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57  e ){.    int isW
1fc20 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
1fc30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fc40 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74  f WAL file exist
1fc50 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50  s */.    Pgno nP
1fc60 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
1fc70 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1fc80 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1fc90 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63 20 3d  ile */..    rc =
1fca0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1fcb0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1fcc0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1fcd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
1fce0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
1fcf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1fd00 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
1fd10 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57  pVfs, pPager->zW
1fd20 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  al, 0);.      if
1fd30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
1fd40 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20  RR_DELETE_NOENT 
1fd50 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
1fd60 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20 3d 20  ;.      isWal = 
1fd70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1fd80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fd90 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
1fda0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73      pPager->pVfs
1fdb0 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
1fdc0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1fdd0 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20 20 20  ISTS, &isWal.   
1fde0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
1fdf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fe00 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
1fe10 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
1fe20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1fe30 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
1fe40 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1fe50 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1fe60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fe70 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c  rOpenWal(pPager,
1fe80 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
1fe90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1fea0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1feb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
1fec0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1fed0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
1fee0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
1fef0 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 20  DE_DELETE;.     
1ff00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1ff10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1ff20 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  if../*.** Playba
1ff30 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
1ff40 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
1ff50 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
1ff60 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
1ff70 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
1ff80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1ff90 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
1ffa0 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
1ffb0 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
1ffc0 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
1ffd0 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
1ffe0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
1fff0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
20000 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
20010 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
20020 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
20030 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
20040 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
20050 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
20060 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
20070 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
20080 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
20090 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
200a0 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
200b0 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
200c0 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
200d0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
200e0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
200f0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20100 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
20110 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
20120 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
20130 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
20140 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
20150 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
20160 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
20170 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
20180 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
20190 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
201a0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
201b0 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
201c0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
201d0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
201e0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
201f0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
20200 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
20210 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
20220 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
20230 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
20240 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
20250 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
20260 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
20270 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
20280 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
20290 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
202a0 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
202b0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
202c0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
202d0 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
202e0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
202f0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
20300 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
20310 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
20320 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
20330 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
20340 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
20350 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
20360 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
20370 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
20380 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
20390 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
203a0 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
203b0 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
203c0 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
203d0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
203e0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
203f0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
20400 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
20410 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
20420 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
20430 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
20440 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
20450 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
20460 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
20470 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
20480 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
20490 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
204a0 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
204b0 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
204c0 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
204d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
204e0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
204f0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
20500 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
20510 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
20520 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
20530 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
20540 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
20550 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
20560 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
20570 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
20580 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
20590 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
205a0 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
205b0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
205c0 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
205d0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
205e0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
205f0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
20600 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
20610 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
20620 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
20630 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
20640 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
20650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20660 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
20670 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
20680 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
20690 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
206a0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
206b0 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
206c0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
206d0 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
206e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
206f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
20700 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
20710 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
20720 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
20730 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
20740 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
20750 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
20760 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
20770 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
20780 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20790 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
207a0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20  TER_LOCKED );.. 
207b0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62   /* Allocate a b
207c0 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20  itvec to use to 
207d0 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66  store the set of
207e0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
207f0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  ck */.  if( pSav
20800 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44  epoint ){.    pD
20810 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  one = sqlite3Bit
20820 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70  vecCreate(pSavep
20830 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20  oint->nOrig);.  
20840 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a    if( !pDone ){.
20850 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20860 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
20870 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
20880 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20890 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
208a0 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65  ue it was before
208b0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
208c0 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72    ** being rever
208d0 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  ted was opened..
208e0 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64    */.  pPager->d
208f0 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69  bSize = pSavepoi
20900 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d  nt ? pSavepoint-
20910 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d  >nOrig : pPager-
20920 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70  >dbOrigSize;.  p
20930 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
20940 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
20950 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
20960 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26  ( !pSavepoint &&
20970 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
20980 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
20990 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  rn pagerRollback
209a0 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Wal(pPager);.  }
209b0 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
209c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
209d0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
209e0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
209f0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
20a00 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
20a10 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
20a20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
20a30 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
20a40 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
20a50 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
20a60 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
20a70 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
20a80 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
20a90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
20aa0 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
20ab0 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
20ac0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20ad0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61  ff;.  assert( pa
20ae0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
20af0 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  )==0 || szJ==0 )
20b00 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
20b10 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
20b20 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
20b30 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
20b40 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
20b50 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
20b60 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
20b70 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
20b80 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
20b90 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
20ba0 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
20bb0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
20bc0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
20bd0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
20be0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
20bf0 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
20c00 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
20c10 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
20c20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
20c30 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
20c40 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
20c50 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
20c60 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
20c70 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
20c80 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
20c90 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  && !pagerUseWal(
20ca0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69  pPager) ){.    i
20cb0 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
20cc0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
20cd0 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
20ce0 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
20cf0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
20d00 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
20d10 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
20d20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20d30 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
20d40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
20d50 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
20d60 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20d70 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
20d80 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
20d90 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
20da0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
20db0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
20dc0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c  TE_DONE );.  }el
20dd0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
20de0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
20df0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e    }..  /* Contin
20e00 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  ue rolling back 
20e10 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74  records out of t
20e20 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20e30 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a  starting at.  **
20e40 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
20e50 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20 61  al header seen a
20e60 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e  nd continuing un
20e70 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69 76  til the effectiv
20e80 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68  e end.  ** of th
20e90 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
20ea0 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74  ile.  Continue t
20eb0 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61  o skip out-of-ra
20ec0 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20  nge pages and.  
20ed0 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69  ** continue addi
20ee0 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  ng pages rolled 
20ef0 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20  back to pDone.. 
20f00 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   */.  while( rc=
20f10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
20f20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20f30 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20  <szJ ){.    u32 
20f40 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
20f50 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
20f60 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20  /.    u32 nJRec 
20f70 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  = 0;     /* Numb
20f80 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
20f90 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
20fa0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
20fb0 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
20fc0 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20  pPager, 0, szJ, 
20fd0 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
20fe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
20ff0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
21000 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
21010 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72  he "pPager->jour
21020 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
21030 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
21040 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21050 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69  f".    ** test i
21060 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63  s related to tic
21070 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65 20  ket #2565.  See 
21080 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69  the discussion i
21090 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
210a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75  er_playback() fu
210b0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74  nction for addit
210c0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
210d0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
210e0 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
210f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21100 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
21110 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
21120 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21130 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
21140 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
21150 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
21160 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
21170 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
21180 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21190 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
211a0 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
211b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
211c0 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
211d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
211e0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
211f0 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
21200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
21210 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
21220 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21230 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
21240 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
21250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
21260 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
21270 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff>=szJ );..  
21280 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
21290 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
212a0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
212b0 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
212c0 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
212d0 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
212e0 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
212f0 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
21300 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
21310 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
21320 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
21330 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
21340 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
21350 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
21360 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
21370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21380 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
21390 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
213a0 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e  i64)pSavepoint->
213b0 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  iSubRec*(4+pPage
213c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
213d0 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57     if( pagerUseW
213e0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
213f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21400 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f  WalSavepointUndo
21410 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
21420 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44  Savepoint->aWalD
21430 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
21440 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e  for(ii=pSavepoin
21450 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d  t->iSubRec; rc==
21460 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
21470 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
21480 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
21490 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69  sert( offset==(i
214a0 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  64)ii*(4+pPager-
214b0 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
214c0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
214d0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
214e0 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74  (pPager, &offset
214f0 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a  , pDone, 0, 1);.
21500 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21520 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  E );.  }..  sqli
21530 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
21540 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72  (pDone);.  if( r
21550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21560 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21570 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
21580 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
21590 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
215a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
215b0 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
215c0 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
215d0 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
215e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
215f0 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
21600 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
21610 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  ge){.  sqlite3Pc
21620 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65  acheSetCachesize
21630 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
21640 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a  , mxPage);.}../*
21650 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54  .** Invoke SQLIT
21660 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d  E_FCNTL_MMAP_LIM
21670 49 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  IT based on the 
21680 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
21690 20 6d 78 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74   mxMmap..*/.stat
216a0 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78  ic void pagerFix
216b0 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a  Maplimit(Pager *
216c0 70 50 61 67 65 72 29 7b 0a 23 69 66 20 21 64 65  pPager){.#if !de
216d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53  fined(SQLITE_DIS
216e0 41 42 4c 45 5f 4d 4d 41 50 29 0a 20 20 73 71 6c  ABLE_MMAP).  sql
216f0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
21700 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
21710 28 20 69 73 4f 70 65 6e 28 66 64 29 20 29 7b 0a  ( isOpen(fd) ){.
21720 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
21730 34 20 6d 78 3b 0a 20 20 20 20 70 50 61 67 65 72  4 mx;.    pPager
21740 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 66  ->bUseFetch = (f
21750 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
21760 72 73 69 6f 6e 3e 3d 33 29 20 26 26 20 70 50 61  rsion>=3) && pPa
21770 67 65 72 2d 3e 6d 78 4d 6d 61 70 3e 30 3b 0a 20  ger->mxMmap>0;. 
21780 20 20 20 6d 78 20 3d 20 70 50 61 67 65 72 2d 3e     mx = pPager->
21790 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 73 71 6c 69  mxMmap;.    sqli
217a0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
217b0 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
217c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
217d0 41 50 5f 4c 49 4d 49 54 2c 20 26 6d 78 29 3b 0a  AP_LIMIT, &mx);.
217e0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
217f0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
21800 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
21810 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  ny memory mappin
21820 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61  g made of the da
21830 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
21840 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21850 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61  rSetMmapLimit(Pa
21860 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
21870 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61  ite3_int64 mxMma
21880 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  p){.  pPager->mx
21890 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20  Mmap = mxMmap;. 
218a0 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
218b0 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  t(pPager);.}../*
218c0 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68  .** Free as much
218d0 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
218e0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ble from the pag
218f0 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
21900 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50  te3PagerShrink(P
21910 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21920 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
21930 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43  rink(pPager->pPC
21940 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
21950 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
21960 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
21970 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
21980 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
21990 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
219a0 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
219b0 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
219c0 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
219d0 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
219e0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
219f0 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
21a00 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
21a10 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
21a20 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
21a30 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
21a40 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
21a50 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
21a60 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
21a70 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
21a80 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
21a90 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
21aa0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
21ab0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
21ac0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
21ae0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
21af0 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
21b00 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
21b10 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
21b20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
21b30 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
21b40 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
21b50 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
21b60 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
21b70 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
21b80 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
21b90 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
21ba0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21bb0 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
21bc0 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
21bd0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
21be0 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
21bf0 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
21c00 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
21c10 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
21c20 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
21c30 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
21c40 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
21c50 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
21c60 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
21c70 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
21c80 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
21c90 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
21ca0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
21cb0 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
21cc0 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
21cd0 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
21ce0 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
21cf0 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
21d00 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
21d10 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
21d20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21d30 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
21d40 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
21d50 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
21d60 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
21d70 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
21d80 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
21d90 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
21da0 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
21db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
21dc0 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
21dd0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
21de0 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
21df0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lback..**.** The
21e00 20 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20   above is for a 
21e10 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
21e20 20 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20   mode.  For WAL 
21e30 6d 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e  mode, OFF contin
21e40 75 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74  ues.** to mean t
21e50 68 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65  hat no syncs eve
21e60 72 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c  r occur.  NORMAL
21e70 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
21e80 57 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a  WAL is synced.**
21e90 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
21ea0 61 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e  art of checkpoin
21eb0 74 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  t and that the d
21ec0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
21ed0 73 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65  synced.** at the
21ee0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74   conclusion of t
21ef0 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  he checkpoint if
21f00 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
21f10 65 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a  ent of the WAL.*
21f20 2a 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61  * was written ba
21f30 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
21f40 62 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79  base.  But no sy
21f50 6e 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63  nc operations oc
21f60 63 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72  cur for.** an or
21f70 64 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e  dinary commit in
21f80 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74   NORMAL mode wit
21f90 68 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61  h WAL.  FULL mea
21fa0 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a  ns that the WAL.
21fb0 2a 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  ** file is synce
21fc0 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68  d following each
21fd0 20 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f   commit operatio
21fe0 6e 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74  n, in addition t
21ff0 6f 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61  o the.** syncs a
22000 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e  ssociated with N
22010 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20  ORMAL..**.** Do 
22020 6e 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63  not confuse sync
22030 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74  hronous=FULL wit
22040 68 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  h SQLITE_SYNC_FU
22050 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49  LL.  The.** SQLI
22060 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63  TE_SYNC_FULL mac
22070 72 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20  ro means to use 
22080 74 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65  the MacOSX-style
22090 20 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75   full-fsync.** u
220a0 73 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c  sing fcntl(F_FUL
220b0 4c 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45  LFSYNC).  SQLITE
220c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61  _SYNC_NORMAL mea
220d0 6e 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f  ns to do an.** o
220e0 72 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20  rdinary fsync() 
220f0 63 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20  call.  There is 
22100 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
22110 74 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e  tween SQLITE_SYN
22120 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51  C_FULL.** and SQ
22130 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
22140 20 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74   on platforms ot
22150 68 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e  her than MacOSX.
22160 20 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e    But the.** syn
22170 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65  chronous=FULL ve
22180 72 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73  rsus synchronous
22190 3d 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20  =NORMAL setting 
221a0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a  determines when.
221b0 2a 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69  ** the xSync pri
221c0 6d 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64  mitive is called
221d0 20 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74   and is relevant
221e0 20 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d   to all platform
221f0 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  s..**.** Numeric
22200 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
22210 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
22220 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
22230 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
22240 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
22250 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22260 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
22270 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
22280 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 0a  SetSafetyLevel(.
22290 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
222a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
222b0 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65  ager to set safe
222c0 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a  ty level for */.
222d0 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20    int level,    
222e0 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d          /* PRAGM
222f0 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20  A synchronous.  
22300 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c  1=OFF, 2=NORMAL,
22310 20 33 3d 46 55 4c 4c 20 2a 2f 20 20 0a 20 20 69   3=FULL */  .  i
22320 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 2c 20 20  nt bFullFsync,  
22330 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66       /* PRAGMA f
22340 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 20 20 69 6e  ullfsync */.  in
22350 74 20 62 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63  t bCkptFullFsync
22360 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 63 68      /* PRAGMA ch
22370 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 73 79  eckpoint_fullfsy
22380 6e 63 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  nc */.){.  asser
22390 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c  t( level>=1 && l
223a0 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61  evel<=3 );.  pPa
223b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
223c0 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
223d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
223e0 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
223f0 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
22400 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
22410 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
22420 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
22430 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
22440 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30  r->syncFlags = 0
22450 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
22460 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ptSyncFlags = 0;
22470 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 46 75  .  }else if( bFu
22480 6c 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70  llFsync ){.    p
22490 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
224a0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
224b0 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ULL;.    pPager-
224c0 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
224d0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
224e0 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  L;.  }else if( b
224f0 43 6b 70 74 46 75 6c 6c 46 73 79 6e 63 20 29 7b  CkptFullFsync ){
22500 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22510 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22520 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22530 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22540 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22550 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
22560 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
22570 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22580 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
22590 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
225a0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
225b0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
225c0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61    }.  pPager->wa
225d0 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61  lSyncFlags = pPa
225e0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
225f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
22600 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
22610 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
22620 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54  gs |= WAL_SYNC_T
22630 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d  RANSACTIONS;.  }
22640 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
22660 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
22670 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
22680 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
22690 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
226a0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
226b0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
226c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
226d0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
226e0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
226f0 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
22700 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
22710 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
22720 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
22730 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
22740 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
22750 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
22760 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
22770 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
22780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
22790 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
227a0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
227b0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
227c0 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
227d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
227e0 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
227f0 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
22800 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
22810 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
22820 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
22830 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
22840 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
22850 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
22860 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
22870 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
22880 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
22890 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
228a0 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
228b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
228c0 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
228d0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
228e0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
228f0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
22900 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
22910 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
22920 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22930 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22940 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
22950 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
22960 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
22970 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22980 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
22990 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
229a0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
229b0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
229c0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
229d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
229e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
229f0 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
22a00 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
22a10 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
22a20 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
22a30 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
22a40 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
22a50 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
22a60 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
22a70 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
22a80 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
22a90 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
22aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
22ab0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
22ac0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
22ad0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
22ae0 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
22af0 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
22b00 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
22b10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22b20 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
22b30 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
22b40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22b50 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
22b60 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
22b70 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
22b80 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
22b90 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
22ba0 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
22bb0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
22bc0 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
22bd0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
22be0 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
22bf0 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
22c00 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
22c10 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
22c20 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
22c30 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
22c40 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
22c50 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
22c60 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
22c70 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
22c80 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
22c90 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
22ca0 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
22cb0 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
22cc0 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
22cd0 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
22ce0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
22cf0 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
22d00 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
22d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
22d30 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
22d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d70 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
22d80 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
22d90 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
22da0 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
22db0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
22dc0 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
22dd0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
22de0 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
22df0 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
22e00 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
22e10 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
22e20 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
22e30 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
22e40 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
22e50 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
22e60 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
22e70 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
22e80 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
22e90 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
22ea0 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
22eb0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
22ec0 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
22ed0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
22ee0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
22ef0 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
22f00 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
22f10 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
22f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
22f30 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
22f40 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
22f50 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
22f60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
22f70 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
22f80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
22f90 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
22fa0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
22fb0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
22fc0 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
22fd0 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70 50  ndler */.){.  pP
22fe0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
22ff0 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
23000 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
23010 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
23020 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
23030 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
23040 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
23050 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76 6f   void **ap = (vo
23060 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78  id **)&pPager->x
23070 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20  BusyHandler;.   
23080 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a   assert( ((int(*
23090 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d  )(void *))(ap[0]
230a0 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72  ))==xBusyHandler
230b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
230c0 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64  ap[1]==pBusyHand
230d0 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73 71  lerArg );.    sq
230e0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
230f0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
23100 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
23110 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f  BUSYHANDLER, (vo
23120 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d 0a  id *)ap);.  }.}.
23130 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
23140 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65 64  e page size used
23150 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f 62   by the Pager ob
23160 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61  ject. The new pa
23170 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70  ge size .** is p
23180 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53  assed in *pPageS
23190 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
231a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
231b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  e error state wh
231c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
231d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a   is called, it.*
231e0 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68  * is a no-op. Th
231f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
23200 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73 74   is the error st
23210 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28  ate error code (
23220 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20  i.e. .** one of 
23230 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e  SQLITE_IOERR, an
23240 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78   SQLITE_IOERR_xx
23250 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53 51  x sub-code or SQ
23260 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
23270 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
23280 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
23290 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
232a0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
232b0 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
232c0 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
232d0 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
232e0 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
232f0 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
23300 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
23310 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
23320 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
23330 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
23340 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
23350 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
23360 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
23370 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
23380 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
23390 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
233a0 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
233b0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
233c0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
233d0 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
233e0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
233f0 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
23400 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
23410 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
23420 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
23430 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
23440 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
23450 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
23460 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
23470 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
23480 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
23490 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
234a0 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
234b0 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
234c0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
234d0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
234e0 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
234f0 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
23500 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
23510 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
23520 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
23530 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
23540 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
23550 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
23560 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
23570 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
23580 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
23590 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
235a0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
235b0 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
235c0 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
235d0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
235e0 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
235f0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
23600 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
23610 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
23620 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
23630 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
23640 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
23650 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
23660 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
23670 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
23680 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a 70   *pPager, u32 *p
23690 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  PageSize, int nR
236a0 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72  eserve){.  int r
236b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
236c0 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
236d0 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61 20  ossible to do a 
236e0 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67 65  full assert_page
236f0 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c 20  r_state() here, 
23700 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  as this.  ** fun
23710 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
23720 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
23730 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65 66  PagerOpen(), bef
23740 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20 20  ore the state.  
23750 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  ** of the Pager 
23760 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72 6e  object is intern
23770 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e  ally consistent.
23780 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e  .  **.  ** At on
23790 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75 6e  e point this fun
237a0 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20 61  ction returned a
237b0 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 70  n error if the p
237c0 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20 2a  ager was in .  *
237d0 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  * PAGER_ERROR st
237e0 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20 50  ate. But since P
237f0 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
23800 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
23810 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
23820 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
23830 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
23840 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75 6e  erence, this fun
23850 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20  ction.  ** is a 
23860 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20 63  no-op for that c
23870 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f  ase anyhow..  */
23880 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a 65  ..  u32 pageSize
23890 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
238a0 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
238b0 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
238c0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
238d0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
238e0 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
238f0 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( (pPager->memD
23900 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  b==0 || pPager->
23910 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26  dbSize==0).   &&
23920 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
23930 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
23940 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 26  PCache)==0 .   &
23950 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  & pageSize && pa
23960 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50 61  geSize!=(u32)pPa
23970 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20  ger->pageSize . 
23980 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 4e   ){.    char *pN
23990 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ew = NULL;      
239a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74 65         /* New te
239b0 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  mp space */.    
239c0 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a  i64 nByte = 0;..
239d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
239e0 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45  eState>PAGER_OPE
239f0 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  N && isOpen(pPag
23a00 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20  er->fd) ){.     
23a10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
23a20 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
23a30 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  fd, &nByte);.   
23a40 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23a50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23a60 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a    pNew = (char *
23a70 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c  )sqlite3PageMall
23a80 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  oc(pageSize);.  
23a90 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 20      if( !pNew ) 
23aa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
23ab0 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  M;.    }..    if
23ac0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23ad0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
23ae0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
23af0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
23b00 7a 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79  ze = (Pgno)((nBy
23b10 74 65 2b 70 61 67 65 53 69 7a 65 2d 31 29 2f 70  te+pageSize-1)/p
23b20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
23b30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23b40 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
23b50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
23b60 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
23b70 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
23b80 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
23b90 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 73 71 6c   pNew;.      sql
23ba0 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
23bb0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
23bc0 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
23bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
23be0 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
23bf0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
23c00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23c10 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
23c20 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
23c30 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
23c40 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
23c50 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
23c60 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
23c70 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
23c80 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
23c90 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
23ca0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
23cb0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46  ger);.    pagerF
23cc0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
23cd0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
23ce0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
23cf0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23d00 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
23d10 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
23d20 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
23d30 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
23d40 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
23d50 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
23d60 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
23d70 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
23d80 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
23d90 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
23da0 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
23db0 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
23dc0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
23dd0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
23de0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
23df0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
23e00 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
23e10 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
23e20 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
23e30 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
23e40 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
23e50 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
23e60 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
23e70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
23e80 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
23e90 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
23ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
23eb0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
23ec0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
23ed0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
23ee0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
23ef0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
23f00 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
23f10 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
23f20 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
23f30 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
23f40 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
23f50 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
23f60 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
23f70 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
23f80 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
23f90 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
23fa0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
23fb0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
23fc0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
23fd0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
23fe0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
23ff0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
24000 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
24010 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
24020 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ge;.  }.  assert
24030 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24040 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20  !=PAGER_OPEN ); 
24050 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f       /* Called o
24060 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63  nly by OP_MaxPgc
24070 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nt */.  assert( 
24080 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d  pPager->mxPgno>=
24090 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
240a0 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e  ;  /* OP_MaxPgcn
240b0 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20  t enforces this 
240c0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  */.  return pPag
240d0 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
240e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
240f0 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
24100 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
24110 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
24120 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
24130 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
24140 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
24150 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
24160 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
24170 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
24180 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
24190 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
241a0 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
241b0 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
241c0 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
241d0 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
241e0 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
241f0 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
24200 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
24210 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
24220 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24230 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
24240 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
24250 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
24260 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
24270 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
24280 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
24290 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
242a0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
242b0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
242c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
242d0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
242e0 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
242f0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24300 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
24310 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24320 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
24330 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
24340 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
24350 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
24360 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
24370 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24380 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
24390 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
243a0 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
243b0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
243c0 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
243d0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
243e0 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
243f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
24400 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
24410 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
24420 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
24430 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
24440 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
24450 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
24460 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
24470 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
24480 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
24490 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
244a0 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
244b0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
244c0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
244d0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
244e0 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
244f0 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
24500 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
24510 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
24520 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
24530 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
24540 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
24550 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
24560 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
24570 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
24580 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
24590 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
245a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
245b0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
245c0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
245d0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
245e0 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
245f0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
24600 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
24610 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
24620 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
24630 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
24640 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
24650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
24660 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
24670 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
24680 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
24690 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
246a0 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
246b0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
246c0 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
246d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
246e0 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
246f0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
24700 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
24710 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
24720 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
24730 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
24740 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
24750 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
24760 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
24770 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
24780 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
24790 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
247a0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
247b0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
247c0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
247d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
247e0 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
247f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
24800 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
24810 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24820 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
24830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24840 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24850 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
24860 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
24870 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
24880 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  is open on.** th
24890 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75  e pager. It retu
248a0 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
248b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
248c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
248d0 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
248e0 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
248f0 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
24900 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
24910 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
24920 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
24930 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
24940 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
24950 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
24960 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24970 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
24980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
24990 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
249a0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
249b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
249c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
249d0 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
249e0 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
249f0 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  ->dbSize;.}.../*
24a00 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
24a10 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
24a20 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
24a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
24a40 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
24a50 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
24a60 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
24a70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24a80 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
24a90 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
24aa0 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
24ab0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
24ac0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
24ad0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
24ae0 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
24af0 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
24b00 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
24b10 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
24b20 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
24b30 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
24b40 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
24b50 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
24b60 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
24b70 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
24b80 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
24b90 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
24ba0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
24bb0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
24bc0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
24bd0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
24be0 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
24bf0 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
24c00 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
24c10 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
24c20 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
24c30 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
24c40 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
24c50 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
24c60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
24c70 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
24c80 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
24c90 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
24ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24cc0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
24cd0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
24ce0 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
24cf0 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
24d00 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
24d10 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
24d20 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f  ready held, or o
24d30 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
24d40 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  stions that the 
24d50 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
24d60 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
24d70 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
24d80 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
24d90 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
24da0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
24db0 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
24dc0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
24dd0 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79  r->eLock>=lockty
24de0 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
24df0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
24e00 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
24e10 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  e==SHARED_LOCK).
24e20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
24e30 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  r->eLock==RESERV
24e40 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  ED_LOCK && lockt
24e50 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
24e60 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20  OCK).  );..  do 
24e70 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
24e80 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c  LockDb(pPager, l
24e90 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  ocktype);.  }whi
24ea0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
24eb0 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
24ec0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
24ed0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
24ee0 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Arg) );.  return
24ef0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
24f00 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
24f10 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
24f20 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
24f30 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
24f40 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
24f50 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
24f60 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
24f70 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
24f80 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
24f90 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
24fa0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
24fb0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
24fc0 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
24fd0 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
24fe0 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
24ff0 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
25000 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
25010 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
25020 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
25030 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
25040 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
25050 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
25060 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
25070 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
25080 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
25090 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
250a0 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
250b0 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
250c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
250d0 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
250e0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
250f0 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
25100 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
25110 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
25120 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
25130 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
25140 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
25150 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
25160 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
25170 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
25180 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
25190 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
251a0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
251b0 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
251c0 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
251d0 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
251e0 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
251f0 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
25200 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  vior would be to
25210 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
25220 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
25230 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
25240 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
25250 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
25260 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
25270 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
25280 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
25290 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
252a0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
252b0 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
252c0 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
252d0 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
252e0 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
252f0 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
25300 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
25310 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
25320 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
25330 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
25340 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
25350 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
25360 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
25370 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
25380 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25390 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
253a0 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
253b0 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
253c0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
253d0 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
253e0 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
253f0 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
25400 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
25410 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
25420 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25430 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25440 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
25450 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
25460 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
25470 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
25480 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
25490 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
254a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
254b0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
254c0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
254d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
254e0 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
254f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
25500 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
25510 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
25520 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
25530 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
25540 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
25550 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
25560 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
25570 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
25580 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
25590 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
255a0 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
255b0 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
255c0 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
255d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
255e0 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
255f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25600 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69  s only called ri
25610 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
25620 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
25630 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ion..** Once thi
25640 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  s function has b
25650 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
25660 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
25670 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f   either be.** ro
25680 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d  lled back or com
25690 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f  mitted. It is no
256a0 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74  t safe to call t
256b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
256c0 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  .** then continu
256d0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
256e0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
256f0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
25700 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
25710 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
25720 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
25730 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
25740 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
25750 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
25760 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
25770 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
25780 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25790 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41  = nPage;..  /* A
257a0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
257b0 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64  code here called
257c0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
257d0 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20  onstraint() to. 
257e0 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
257f0 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20  all pages being 
25800 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62  truncated away b
25810 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
25820 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e   are,.  ** if on
25830 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
25840 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70  ints are open, p
25850 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61  resent in the sa
25860 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f  vepoint .  ** jo
25870 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68  urnal so that th
25880 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
25890 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f  ed if the savepo
258a0 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20  int is rolled.  
258b0 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ** back. This is
258c0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73   no longer neces
258d0 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e  sary as this fun
258e0 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c  ction is now onl
258f0 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69  y.  ** called ri
25900 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
25910 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
25920 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68  ion. So although
25930 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
25940 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c   object may stil
25950 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65  l have open save
25960 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53  points (Pager.nS
25970 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20  avepoint!=0), . 
25980 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   ** they cannot 
25990 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
259a0 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75  So the assertTru
259b0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
259c0 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e  ) call.  ** is n
259d0 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74  o longer correct
259e0 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  . */.}.../*.** T
259f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
25a00 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
25a10 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
25a20 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
25a30 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
25a40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
25a50 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
25a60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
25a70 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
25a80 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
25a90 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
25aa0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
25ab0 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
25ac0 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
25ad0 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
25ae0 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
25af0 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
25b00 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
25b10 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
25b20 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
25b30 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
25b40 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
25b50 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
25b60 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
25b70 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
25b80 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
25b90 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
25ba0 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
25bb0 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
25bc0 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
25bd0 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
25be0 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
25bf0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
25c00 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
25c10 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
25c20 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
25c30 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
25c40 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
25c50 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
25c60 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
25c70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25c80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25c90 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
25ca0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
25cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
25cc0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
25cd0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
25ce0 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
25cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25d00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25d10 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
25d20 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
25d30 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
25d40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25d50 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
25d60 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
25d70 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   memory mapped p
25d80 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70  age object for p
25d90 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
25da0 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a   .** The new obj
25db0 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ect will use the
25dc0 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20   pointer pData, 
25dd0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46  obtained from xF
25de0 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75  etch()..** If su
25df0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
25e00 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74  pPage to point t
25e10 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72  o the new page r
25e20 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20  eference.** and 
25e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25e40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
25e50 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
25e60 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74  ror code and set
25e70 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a  .** *ppPage to z
25e80 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ero..**.** Page 
25e90 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69  references obtai
25ea0 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ned by calling t
25eb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
25ec0 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a  uld be released.
25ed0 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61  ** by calling pa
25ee0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
25ef0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
25f00 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  nt pagerAcquireM
25f10 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20  apPage(.  Pager 
25f20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
25f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
25f40 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
25f50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
25f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f70 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  * Page number */
25f80 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  .  void *pData, 
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64     /* xFetch()'d
25fb0 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70   data for this p
25fc0 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
25fd0 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20  *ppPage         
25fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
25ff0 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f   Acquired page o
26000 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67  bject */.){.  Pg
26010 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
26020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26030 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   Memory mapped p
26040 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  age to return */
26050 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
26060 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b  pMmapFreelist ){
26070 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
26080 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
26090 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50  Freelist;.    pP
260a0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
260b0 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ist = p->pDirty;
260c0 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d  .    p->pDirty =
260d0 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   0;.    memset(p
260e0 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61  ->pExtra, 0, pPa
260f0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
26100 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
26110 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20  ge = p = (PgHdr 
26120 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
26130 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72  ero(sizeof(PgHdr
26140 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
26150 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ra);.    if( p==
26160 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
26170 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
26180 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67  er->fd, (i64)(pg
26190 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e  no-1) * pPager->
261a0 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
261b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
261c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
261d0 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
261e0 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
261f0 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
26200 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
26210 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
26220 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
26230 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
26240 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
26250 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
26260 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26270 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
26280 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
26290 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
262a0 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
262b0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
262c0 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
262d0 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
262e0 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
262f0 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
26300 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
26310 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26320 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
26330 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
26340 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70  e to page pPg. p
26350 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  Pg must have bee
26360 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  n returned by an
26370 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c   .** earlier cal
26380 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72  l to pagerAcquir
26390 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
263a0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
263b0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50  ReleaseMapPage(P
263c0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
263d0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
263e0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61  g->pPager;.  pPa
263f0 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b  ger->nMmapOut--;
26400 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
26410 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26420 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72  eelist;.  pPager
26430 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26440 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74  = pPg;..  assert
26450 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
26460 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
26470 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=3 );.  sqlite3
26480 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26490 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d  ->fd, (i64)(pPg-
264a0 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  >pgno-1)*pPager-
264b0 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e  >pageSize, pPg->
264c0 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
264d0 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20   Free all PgHdr 
264e0 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69  objects stored i
264f0 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61  n the Pager.pMma
26500 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a  pFreelist list..
26510 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
26520 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
26530 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26540 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67    PgHdr *p;.  Pg
26550 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Hdr *pNext;.  fo
26560 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61  r(p=pPager->pMma
26570 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d  pFreelist; p; p=
26580 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
26590 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
265a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
265b0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
265c0 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
265d0 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
265e0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
265f0 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
26600 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
26610 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
26620 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
26630 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
26640 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
26650 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
26660 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
26670 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
26680 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
26690 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
266a0 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
266b0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
266c0 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
266d0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
266e0 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
266f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
26700 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
26710 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
26720 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
26730 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26740 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
26750 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
26760 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
26770 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
26780 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
26790 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
267a0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
267b0 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
267c0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
267d0 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
267e0 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
267f0 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
26800 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
26810 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
26820 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
26830 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26840 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
26850 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
26860 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ace;..  assert( 
26870 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
26880 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
26890 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
268a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
268b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
268c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
268d0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
268e0 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
268f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
26900 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
26910 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
26920 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
26930 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
26940 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
26950 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
26960 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
26970 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
26980 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
26990 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
269a0 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
269b0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
269c0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
269d0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
269e0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
269f0 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
26a00 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
26a10 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
26a20 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
26a30 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
26a40 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
26a50 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
26a60 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
26a70 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
26a80 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
26a90 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
26aa0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
26ab0 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
26ac0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
26ad0 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
26ae0 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
26af0 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
26b00 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
26b10 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
26b20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
26b30 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
26b40 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
26b50 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
26b60 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
26b70 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
26b80 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
26b90 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
26ba0 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
26bb0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
26bc0 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
26bd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
26be0 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
26bf0 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
26c00 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
26c10 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
26c20 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
26c30 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
26c40 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
26c50 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
26c60 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
26c70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
26c80 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
26c90 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
26ca0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
26cb0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
26cc0 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
26cd0 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
26ce0 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
26cf0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
26d00 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
26d10 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
26d20 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
26d30 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
26d40 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
26d50 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
26d60 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
26d70 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
26d80 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
26d90 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
26da0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
26db0 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
26dc0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
26dd0 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
26de0 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
26df0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
26e00 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
26e10 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
26e20 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
26e30 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
26e40 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
26e50 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
26e60 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
26e70 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
26e80 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
26e90 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
26ea0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
26eb0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
26ec0 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
26ed0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
26ee0 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
26ef0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
26f00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26f10 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
26f20 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
26f30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
26f40 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
26f50 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
26f60 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
26f70 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
26f80 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
26f90 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
26fa0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
26fb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
26fc0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
26fd0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
26fe0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
26ff0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
27000 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
27010 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27020 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
27030 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
27040 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
27050 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
27060 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
27070 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
27080 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
27090 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
270a0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
270b0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
270c0 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
270d0 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
270e0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
270f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27100 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
27110 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
27120 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
27130 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27140 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
27150 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
27160 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
27170 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
27180 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
27190 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
271a0 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
271b0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
271c0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
271d0 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
271e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
271f0 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
27200 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
27210 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
27220 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
27230 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27240 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
27250 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
27260 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
27270 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
27280 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
27290 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
272a0 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
272b0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
272c0 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
272d0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
272e0 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
272f0 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
27300 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
27310 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
27320 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
27330 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
27340 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
27350 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
27360 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27370 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
27380 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
27390 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
273a0 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
273b0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
273c0 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
273d0 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
273e0 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
273f0 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
27400 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
27410 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
27420 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
27430 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
27440 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
27450 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
27460 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
27470 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
27480 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27490 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
274a0 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
274b0 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
274c0 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
274d0 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
274e0 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
274f0 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
27500 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
27510 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
27520 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
27530 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
27540 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
27550 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
27560 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
27570 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
27580 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
27590 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
275a0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
275b0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
275c0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
275d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
275e0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
275f0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
27600 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27620 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
27630 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
27640 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
27650 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27660 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
27670 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
27680 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
27690 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
276a0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
276b0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
276c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
276d0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
276e0 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
276f0 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
27700 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
27710 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
27720 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27730 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
27740 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
27750 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
27760 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
27770 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
27780 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
27790 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
277a0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
277b0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
277c0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
277d0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
277e0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
277f0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
27800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
27810 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27820 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
27830 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
27840 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
27850 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
27860 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
27870 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
27880 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
27890 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
278a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
278b0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
278c0 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
278d0 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
278e0 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
278f0 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
27900 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
27910 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
27920 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
27930 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
27940 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
27950 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
27960 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
27970 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
27980 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
27990 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
279a0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
279b0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
279c0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
279d0 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
279e0 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
279f0 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
27a00 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
27a10 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
27a20 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
27a30 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
27a40 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
27a50 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
27a60 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
27a70 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
27a80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
27a90 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
27aa0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
27ab0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
27ac0 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
27ad0 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
27ae0 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
27af0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
27b00 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27b10 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
27b20 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
27b30 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
27b40 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
27b50 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
27b60 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
27b70 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
27b80 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
27b90 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
27ba0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
27bb0 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
27bc0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
27bd0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
27be0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
27bf0 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
27c00 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
27c10 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
27c20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
27c30 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
27c40 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
27c50 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
27c60 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
27c70 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
27c80 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
27c90 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
27ca0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
27cb0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
27cc0 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
27cd0 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
27ce0 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
27cf0 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
27d00 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
27d10 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
27d20 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
27d30 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
27d40 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
27d50 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
27d60 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
27d70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
27d80 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
27d90 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
27da0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
27db0 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
27dc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
27dd0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
27de0 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
27df0 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
27e00 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
27e10 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
27e20 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
27e30 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
27e40 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
27e50 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
27e60 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
27e70 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
27e80 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
27e90 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
27ea0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
27eb0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
27ec0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
27ed0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
27ee0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
27ef0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
27f00 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
27f10 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
27f20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
27f30 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
27f40 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
27f50 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
27f60 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
27f70 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
27f80 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
27f90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27fa0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
27fb0 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
27fc0 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
27fd0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
27fe0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27ff0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
28000 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
28010 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
28020 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28030 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28040 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
28050 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
28060 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28070 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
28080 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
28090 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
280a0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
280b0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
280c0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
280d0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
280e0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
280f0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
28100 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
28110 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
28120 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
28130 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
28140 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28150 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
28160 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
28170 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
28180 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
28190 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
281a0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
281b0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
281c0 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
281d0 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
281e0 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
281f0 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
28200 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
28210 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
28220 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
28230 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
28240 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
28250 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
28260 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
28270 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
28280 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
28290 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
282a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
282b0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
282c0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
282d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
282e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
282f0 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
28300 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
28310 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28320 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
28330 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28340 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
28350 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28360 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28370 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28380 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
28390 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
283a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
283b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
283c0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
283d0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
283e0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
283f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
28400 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28410 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
28420 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28430 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
28440 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
28450 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28460 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
28470 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28480 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28490 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
284a0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
284b0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
284c0 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
284d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
284e0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
284f0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
28500 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
28510 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
28520 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
28530 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
28540 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28550 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28560 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
28570 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
28580 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
28590 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
285a0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
285b0 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
285c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
285d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
285e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
285f0 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
28600 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
28610 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
28620 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
28630 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
28640 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
28650 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
28660 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
28670 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
28680 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
28690 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
286a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
286b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
286c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
286d0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
286e0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
286f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28700 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
28710 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
28720 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
28730 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
28740 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
28750 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
28760 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
28770 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
28780 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
28790 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
287a0 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
287b0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
287c0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
287d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
287e0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
287f0 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
28800 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
28810 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
28820 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
28830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
28840 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
28850 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
28860 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
28870 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
28880 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
28890 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
288a0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
288b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
288c0 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
288d0 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
288e0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
288f0 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
28900 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
28910 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
28920 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
28930 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
28940 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
28950 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28960 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
28970 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
28980 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
28990 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
289a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
289b0 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
289c0 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
289d0 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
289e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
289f0 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
28a00 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
28a10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
28a20 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
28a30 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
28a40 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
28a50 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
28a60 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
28a70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28a80 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
28a90 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
28aa0 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
28ab0 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
28ac0 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
28ad0 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
28ae0 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
28af0 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
28b00 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
28b10 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
28b20 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
28b30 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
28b40 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
28b50 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
28b60 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
28b70 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
28b80 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
28b90 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
28ba0 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
28bb0 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
28bc0 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
28bd0 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
28be0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
28bf0 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
28c00 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
28c10 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
28c20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
28c30 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
28c40 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
28c50 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
28c60 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
28c70 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
28c80 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
28c90 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
28ca0 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
28cb0 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
28cc0 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
28cd0 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
28ce0 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
28cf0 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
28d00 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
28d10 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
28d20 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
28d30 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
28d40 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
28d50 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
28d60 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
28d70 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
28d80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
28d90 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
28da0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
28db0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
28dc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
28dd0 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
28de0 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
28df0 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
28e00 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
28e10 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
28e20 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
28e30 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
28e40 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
28e50 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
28e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
28e90 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
28ea0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
28eb0 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
28ec0 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
28ed0 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
28ee0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
28ef0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
28f00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
28f10 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
28f20 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
28f30 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
28f40 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
28f50 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
28f60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
28f70 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e is a temp-file
28f80 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
28f90 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
28fa0 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69  t now. It.  ** i
28fb0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
28fc0 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65  or rc to be othe
28fd0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
28fe0 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a   if this branch.
28ff0 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61    ** is taken, a
29000 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  s pager_wait_on_
29010 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
29020 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73  p for temp-files
29030 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73  ..  */.  if( !is
29040 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
29050 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29060 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
29070 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
29080 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
29090 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
290a0 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
290b0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
290c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66  );.  }..  /* Bef
290d0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72  ore the first wr
290e0 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46  ite, give the VF
290f0 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74  S a hint of what
29100 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20   the final.  ** 
29110 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62  file size will b
29120 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
29130 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29140 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
29150 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72  ->fd) );.  if( r
29160 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
29170 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72   && (pList->pDir
29180 74 79 20 3f 20 70 50 61 67 65 72 2d 3e 64 62 53  ty ? pPager->dbS
29190 69 7a 65 20 3a 20 70 4c 69 73 74 2d 3e 70 67 6e  ize : pList->pgn
291a0 6f 2b 31 29 3e 70 50 61 67 65 72 2d 3e 64 62 48  o+1)>pPager->dbH
291b0 69 6e 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  intSize .  ){.  
291c0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
291d0 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d  szFile = pPager-
291e0 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c  >pageSize * (sql
291f0 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65  ite3_int64)pPage
29200 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73  r->dbSize;.    s
29210 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
29220 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
29230 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
29240 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46  _SIZE_HINT, &szF
29250 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ile);.    pPager
29260 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70  ->dbHintSize = p
29270 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29280 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   }..  while( rc=
29290 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c  =SQLITE_OK && pL
292a0 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ist ){.    Pgno 
292b0 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67  pgno = pList->pg
292c0 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  no;..    /* If t
292d0 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
292e0 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
292f0 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
29300 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
29310 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
29320 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
29330 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
29340 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
29350 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
29360 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
29370 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
29380 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
29390 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
293a0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
293b0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
293c0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
293d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
293e0 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  o, do not write 
293f0 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74 68 61  out any page tha
29400 74 20 68 61 73 20 74 68 65 20 50 47 48 44 52 5f  t has the PGHDR_
29410 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a  DONT_WRITE flag.
29420 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20      ** set (set 
29430 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  by sqlite3PagerD
29440 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20  ontWrite())..   
29450 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
29460 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
29470 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
29480 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
29490 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
294a0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67  i64 offset = (pg
294b0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
294c0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f  r->pageSize;   /
294d0 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74  * Offset to writ
294e0 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  e */.      char 
294f0 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
29520 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20  a to write */   
29530 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   ..      assert(
29540 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50   (pList->flags&P
29550 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
29560 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
29570 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
29580 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
29590 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
295a0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63  );..      /* Enc
295b0 6f 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ode the database
295c0 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32   */.      CODEC2
295d0 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  (pPager, pList->
295e0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20  pData, pgno, 6, 
295f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
29600 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  MEM, pData);..  
29610 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
29620 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
29630 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
29640 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
29650 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
29660 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29670 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
29680 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
29690 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
296a0 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
296b0 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
296c0 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
296d0 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
296e0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
296f0 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
29700 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
29710 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
29720 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
29730 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
29740 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
29750 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
29760 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
29770 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
29780 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
29790 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
297a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
297b0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
297c0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
297d0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
297e0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
297f0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
29800 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
29810 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
29820 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
29830 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  TE]++;..      /*
29840 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
29850 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
29860 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
29870 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
29880 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
29890 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
298a0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
298b0 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
298c0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
298d0 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
298e0 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
298f0 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
29900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
29910 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
29920 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
29930 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
29940 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
29950 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
29960 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
29970 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
29980 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
29990 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
299a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
299b0 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
299c0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
299d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
299e0 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
299f0 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
29a00 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
29a10 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
29a20 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
29a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29a40 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
29a50 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
29a60 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
29a70 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
29a80 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
29a90 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
29aa0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
29ab0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
29ac0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
29ad0 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
29ae0 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
29af0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
29b00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
29b10 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
29b20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
29b30 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
29b40 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
29b50 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
29b60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
29b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29b80 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
29b90 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
29ba0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
29bb0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
29bc0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
29bd0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
29be0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
29bf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
29c00 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
29c10 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20  ger->sjfd);.    
29c20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
29c30 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
29c40 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
29c50 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45  sjfd, SQLITE_OPE
29c60 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20  N_SUBJOURNAL);. 
29c70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29c80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
29c90 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f  ppend a record o
29ca0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  f the current st
29cb0 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20  ate of page pPg 
29cc0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
29cd0 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68  al. .** It is th
29ce0 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
29cf0 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20  sibility to use 
29d00 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
29d10 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20  () to check .** 
29d20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c  that it is reall
29d30 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  y required befor
29d40 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
29d50 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
29d60 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
29d70 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
29d80 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
29d90 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
29da0 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
29db0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
29dc0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
29dd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
29de0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
29df0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
29e00 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
29e10 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
29e20 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
29e30 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
29e40 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
29e50 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
29e60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
29e70 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
29e80 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
29e90 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
29ea0 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
29eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
29ec0 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
29ed0 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
29ee0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29ef0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
29f00 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
29f10 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
29f20 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
29f30 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
29f40 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
29f50 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
29f60 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
29f70 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
29f80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
29f90 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
29fa0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
29fb0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
29fc0 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
29fd0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
29fe0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
29ff0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a000 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
2a010 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2a020 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2a030 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
2a040 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
2a050 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20 20 20  rnal(pPg) .     
2a060 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
2a070 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
2a080 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
2a090 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2a0a0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
2a0b0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
2a0c0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
2a0d0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
2a0e0 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
2a0f0 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
2a100 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
2a110 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
2a120 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
2a130 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a140 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
2a150 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
2a160 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
2a170 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65  set = (i64)pPage
2a180 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
2a190 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2a1a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2a1b0 74 61 32 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f  ta2;.  .      CO
2a1c0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
2a1d0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
2a1e0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2a1f0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
2a200 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2a210 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
2a220 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2a230 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a240 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2a250 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2a260 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
2a270 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
2a280 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2a290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a2a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2a2b0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2a2c0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
2a2d0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2a2e0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
2a2f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a300 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2a310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
2a320 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
2a330 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2a340 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
2a350 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
2a360 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2a370 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
2a380 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2a390 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a3a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2a3b0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2a3c0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2a3d0 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2a3e0 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2a3f0 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2a400 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2a410 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2a420 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2a430 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2a440 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2a450 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2a460 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2a470 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2a480 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2a490 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2a4a0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2a4b0 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2a4c0 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2a4d0 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2a4e0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2a4f0 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2a500 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2a510 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2a520 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2a530 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2a540 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2a550 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2a560 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2a570 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2a580 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2a590 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2a5a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a5b0 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2a5c0 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2a5d0 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2a5e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2a5f0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2a600 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2a610 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2a620 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2a630 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2a640 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2a650 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2a660 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2a670 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2a680 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2a690 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2a6a0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2a6b0 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2a6c0 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2a6d0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2a6e0 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2a6f0 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2a700 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2a710 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2a720 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2a730 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2a740 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2a750 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2a760 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2a770 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2a780 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2a790 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a7a0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2a7b0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2a7c0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2a7d0 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2a7e0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2a7f0 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
2a800 53 70 69 6c 6c 20 66 6c 61 67 20 69 73 20 73 65  Spill flag is se
2a810 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
2a820 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
2a830 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
2a840 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
2a850 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
2a860 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
2a870 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
2a880 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
2a890 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2a8a0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2a8b0 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
2a8c0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
2a8d0 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
2a8e0 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
2a8f0 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
2a900 69 6c 6c 20 66 6c 61 67 20 69 6e 68 69 62 69 74  ill flag inhibit
2a910 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2a920 6c 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ling regardless 
2a930 6f 66 20 77 68 65 74 68 65 72 0a 20 20 2a 2a 20  of whether.  ** 
2a940 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2a950 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2a960 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20 61   is set during a
2a970 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 0a   rollback..  **.
2a980 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
2a990 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
2a9a0 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
2a9b0 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
2a9c0 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
2a9d0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
2a9e0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
2a9f0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
2aa00 65 6d 65 6e 74 61 74 6f 6e 20 69 74 20 0a 20 20  ementaton it .  
2aa10 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  ** is impossible
2aa20 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63   for sqlite3Pcac
2aa30 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20  heFetch() to be 
2aa40 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61  called with crea
2aa50 74 65 46 6c 61 67 3d 3d 31 0a 20 20 2a 2a 20 77  teFlag==1.  ** w
2aa60 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f  hile in the erro
2aa70 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69  r state, hence i
2aa80 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  t is impossible 
2aa90 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
2aaa0 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c   to.  ** be call
2aab0 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  ed in the error 
2aac0 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65  state.  Neverthe
2aad0 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
2aae0 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20   a NEVER().  ** 
2aaf0 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72  test for the err
2ab00 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61  or state as a sa
2ab10 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20  feguard against 
2ab20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a  future changes..
2ab30 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2ab40 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
2ab50 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
2ab60 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
2ab70 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 29  er->doNotSpill )
2ab80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2ab90 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
2aba0 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20  >doNotSyncSpill 
2abb0 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  && (pPg->flags &
2abc0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2abd0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
2abe0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2abf0 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  }..  pPg->pDirty
2ac00 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2ac10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2ac20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ){.    /* Write 
2ac30 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 66  a single frame f
2ac40 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f 20  or this page to 
2ac50 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  the log. */.    
2ac60 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
2ac70 50 61 67 65 28 70 50 67 29 20 29 7b 20 0a 20 20  Page(pPg) ){ .  
2ac80 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2ac90 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 20 0a 20  nalPage(pPg); . 
2aca0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2acb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2acc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57 61      rc = pagerWa
2acd0 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c 20  lFrames(pPager, 
2ace0 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pPg, 0, 0);.    
2acf0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20  }.  }else{.  .  
2ad00 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
2ad10 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65  urnal file if re
2ad20 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69  quired. */.    i
2ad30 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
2ad40 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20  HDR_NEED_SYNC . 
2ad50 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
2ad60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
2ad70 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
2ad80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2ad90 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
2ada0 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  r, 1);.    }.  .
2adb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
2adc0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69  ge number of thi
2add0 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72  s page is larger
2ade0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
2adf0 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a  t size of.    **
2ae00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
2ae10 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65 64  age, it may need
2ae20 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 74   to be written t
2ae30 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2ae40 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  l..    ** This i
2ae50 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
2ae60 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69 74  ll to pager_writ
2ae70 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65 6c  e_pagelist() bel
2ae80 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20  ow will not.    
2ae90 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
2aea0 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
2aeb0 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
2aec0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
2aed0 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
2aee0 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  owing sequence o
2aef0 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a 2a  f events:.    **
2af00 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  .    **   BEGIN;
2af10 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75  .    **     <jou
2af20 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 20  rnal page X>.   
2af30 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79 20   **     <modify 
2af40 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20  page X>.    **  
2af50 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b     SAVEPOINT sp;
2af60 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  .    **       <s
2af70 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
2af80 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
2af90 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67      **       pag
2afa0 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29  erStress(page X)
2afb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  .    **     ROLL
2afc0 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20  BACK TO sp;.    
2afd0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58 3e  **.    ** If (X>
2afe0 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61  Y), then when pa
2aff0 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61 6c  gerStress is cal
2b000 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20  led page X will 
2b010 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20  not be written. 
2b020 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65     ** out to the
2b030 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2b040 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70  but will be drop
2b050 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ped from the cac
2b060 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a 2a  he. Then,.    **
2b070 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22   following the "
2b080 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
2b090 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64 69  statement, readi
2b0a0 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20 72  ng page X will r
2b0b0 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ead.    ** data 
2b0c0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2b0d0 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69 6c  e file. This wil
2b0e0 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f 66  l be the copy of
2b0f0 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20 20   page X as it.  
2b100 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
2b110 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
2b120 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
2b130 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
2b140 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a 20  OINT sp".    ** 
2b150 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20  was executed..  
2b160 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2b170 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
2b180 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
2b190 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
2b1a0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
2b1b0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  * sub-journal fi
2b1c0 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73  le now (if it is
2b1d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65   not already the
2b1e0 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20  re), so that it 
2b1f0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72  will.    ** be r
2b200 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63  estored to its c
2b210 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65  urrent value whe
2b220 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  n the "ROLLBACK 
2b230 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20 2a  TO sp" is .    *
2b240 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20  * executed..    
2b250 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  */.    if( NEVER
2b260 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51  (.        rc==SQ
2b270 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d 3e  LITE_OK && pPg->
2b280 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53  pgno>pPager->dbS
2b290 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69  ize && subjRequi
2b2a0 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20  resPage(pPg).   
2b2b0 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   ) ){.      rc =
2b2c0 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2b2d0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  pPg);.    }.  . 
2b2e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
2b2f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b300 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20  page out to the 
2b310 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
2b320 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b330 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b340 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
2b350 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2b360 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
2b370 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
2b380 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67  te_pagelist(pPag
2b390 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a  er, pPg);.    }.
2b3a0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
2b3b0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
2b3c0 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
2b3d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b3e0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52  PAGERTRACE(("STR
2b3f0 45 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ESS %d page %d\n
2b400 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2b410 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2b420 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2b430 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
2b440 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2b450 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
2b460 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 0a 2f 2a  er, rc); .}.../*
2b470 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
2b480 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2b490 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  w Pager object a
2b4a0 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
2b4b0 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70   to it.** in *pp
2b4c0 50 61 67 65 72 2e 20 54 68 65 20 70 61 67 65 72  Pager. The pager
2b4d0 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c   should eventual
2b4e0 6c 79 20 62 65 20 66 72 65 65 64 20 62 79 20 70  ly be freed by p
2b4f0 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20  assing it.** to 
2b500 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
2b510 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  e()..**.** The z
2b520 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
2b530 74 20 69 73 20 74 68 65 20 70 61 74 68 20 74 6f  t is the path to
2b540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b550 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49  le to open..** I
2b560 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
2b570 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
2b580 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
2b590 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
2b5a0 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
2b5b0 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
2b5c0 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72  e cached. Tempor
2b5d0 61 72 79 20 66 69 6c 65 73 20 61 72 65 20 62 65  ary files are be
2b5e0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
2b5f0 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74  matically when t
2b600 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20  hey are closed. 
2b610 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
2b620 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
2b630 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  .** all informat
2b640 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
2b650 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65  ache. It is neve
2b660 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
2b670 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20  k. .** This can 
2b680 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
2b690 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  ment an in-memor
2b6a0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
2b6b0 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70 61 72  * The nExtra par
2b6c0 61 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 73  ameter specifies
2b6d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2b6e0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c  ytes of space al
2b6f0 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67  located.** along
2b700 20 77 69 74 68 20 65 61 63 68 20 70 61 67 65 20   with each page 
2b710 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
2b720 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62  space is availab
2b730 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a  le to the user.*
2b740 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69 74 65  * via the sqlite
2b750 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 29  3PagerGetExtra()
2b760 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   API..**.** The 
2b770 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2b780 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2b790 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
2b7a0 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
2b7b0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
2b7c0 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
2b7d0 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
2b7e0 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
2b7f0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
2b800 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
2b810 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
2b820 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
2b830 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
2b840 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
2b850 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
2b860 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
2b870 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
2b880 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2b890 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2b8a0 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2b8b0 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2b8c0 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2b8d0 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2b8e0 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2b8f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2b900 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2b910 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2b920 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2b930 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2b940 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2b950 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2b960 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2b970 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2b980 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2b990 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2b9a0 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2b9b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2b9c0 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2b9d0 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2b9e0 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2b9f0 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2ba00 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2ba10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2ba20 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2ba30 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2ba40 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2ba50 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2ba60 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2ba70 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2ba80 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2ba90 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2baa0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2bab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2bac0 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2bad0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2bae0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2baf0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb10 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2bb20 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2bb30 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2bb40 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2bb50 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2bb60 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2bb70 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2bb80 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2bb90 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2bba0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2bbb0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2bbc0 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2bbd0 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2bbe0 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2bbf0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2bc00 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2bc10 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2bc20 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2bc30 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2bc40 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2bc50 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2bc60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bc70 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2bc80 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2bc90 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2bca0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2bcb0 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2bcc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2bcd0 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2bce0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2bcf0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2bd00 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2bd10 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  file */.  int re
2bd20 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2bd30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2bd40 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2bd50 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2bd60 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2bd70 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2bd80 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2bd90 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2bda0 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2bdb0 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2bdc0 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2bdd0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2bde0 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2bdf0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2be00 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2be10 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2be20 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2be30 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2be40 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2be50 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2be60 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2be70 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2be80 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2be90 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2bea0 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2beb0 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2bec0 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2bed0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2bee0 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2bef0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2bf00 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2bf10 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2bf20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2bf30 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2bf40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2bf50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2bf60 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2bf70 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2bf80 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2bf90 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2bfa0 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2bfb0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2bfc0 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2bfd0 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2bfe0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2bff0 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2c000 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a  rnal). This.  **
2c010 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
2c020 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66  space required f
2c030 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
2c040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2c050 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20  dle .  ** and a 
2c060 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
2c070 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74  file-handle. Not
2c080 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61  e that a "regula
2c090 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65  r journal-handle
2c0a0 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20  ".  ** may be a 
2c0b0 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20  wrapper capable 
2c0c0 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66  of caching the f
2c0d0 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20  irst portion of 
2c0e0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
2c0f0 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20   file in memory 
2c100 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
2c110 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2c120 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20  timization (see 
2c130 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c  .  ** source fil
2c140 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20  e journal.c)..  
2c150 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2c160 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2c170 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
2c180 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
2c190 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2c1a0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2c1b0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2c1c0 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s));.  }else{.  
2c1d0 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
2c1e0 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
2c1f0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2c200 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ());.  }..  /* S
2c210 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
2c220 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69  riable to NULL i
2c230 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
2c240 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70  occurs. */.  *pp
2c250 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e  Pager = 0;..#ifn
2c260 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2c270 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66  MEMORYDB.  if( f
2c280 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d  lags & PAGER_MEM
2c290 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62  ORY ){.    memDb
2c2a0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46   = 1;.    if( zF
2c2b0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2c2c0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20  name[0] ){.     
2c2d0 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
2c2e0 69 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20  ite3DbStrDup(0, 
2c2f0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2c300 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2c310 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c  =0  ) return SQL
2c320 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2c330 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2c340 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2c350 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2c360 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2c370 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2c380 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2c390 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2c3a0 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2c3b0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2c3c0 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2c3d0 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2c3e0 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2c3f0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2c400 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2c410 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2c420 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2c430 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2c440 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2c450 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2c460 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2c470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2c480 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2c490 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2c4a0 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2c4b0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2c4c0 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2c4d0 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2c4e0 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2c4f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c500 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2c510 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
2c520 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72  = 0; /* Make sur
2c530 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76  e initialized ev
2c540 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61  en if FullPathna
2c550 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20  me() fails */.  
2c560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2c570 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
2c580 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
2c590 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
2c5a0 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61  me);.    nPathna
2c5b0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2c5c0 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2c5d0 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20  .    z = zUri = 
2c5e0 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74  &zFilename[sqlit
2c5f0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
2c600 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  name)+1];.    wh
2c610 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
2c620 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72   z += sqlite3Str
2c630 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20  len30(z)+1;.    
2c640 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    z += sqlite3St
2c650 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20  rlen30(z)+1;.   
2c660 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69   }.    nUri = (i
2c670 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69  nt)(&z[1] - zUri
2c680 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2c690 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  Uri>=0 );.    if
2c6a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c6b0 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70  && nPathname+8>p
2c6c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2c6d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
2c6e0 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
2c6f0 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2c700 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20  l path required 
2c710 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  by.      ** the 
2c720 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f  database being o
2c730 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f  pened will be mo
2c740 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78  re than pVfs->mx
2c750 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a  Pathname.      *
2c760 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  * bytes in lengt
2c770 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  h. This means th
2c780 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
2c790 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20  t be opened,.   
2c7a0 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c     ** as it will
2c7b0 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
2c7c0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2c7d0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65  rnal file or eve
2c7e0 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b  n.      ** check
2c7f0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
2c800 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e  al before readin
2c810 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
2c820 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
2c830 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
2c840 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2c850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c860 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c870 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2c880 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2c890 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2c8a0 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
2c8b0 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
2c8c0 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
2c8d0 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
2c8e0 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
2c8f0 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
2c900 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2c910 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
2c920 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
2c930 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
2c940 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
2c950 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
2c960 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
2c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c980 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
2c990 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
2c9a0 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9c0 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
2c9d0 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
2c9e0 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2c9f0 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
2ca00 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
2ca10 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
2ca20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
2ca30 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2ca40 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
2ca50 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
2ca60 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
2ca70 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2ca80 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
2ca90 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
2caa0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2cab0 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
2cac0 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
2cad0 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
2cae0 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
2caf0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2cb00 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
2cb10 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
2cb20 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
2cb30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2cb40 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
2cb50 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
2cb60 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
2cb70 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
2cb80 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
2cb90 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
2cba0 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
2cbb0 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
2cbc0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
2cbd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
2cbe0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
2cbf0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2cc00 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
2cc10 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
2cc20 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
2cc30 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
2cc40 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20 20 20   nUri +         
2cc50 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
2cc60 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
2cc70 38 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  8 + 2           
2cc80 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
2cc90 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2cca0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20  _OMIT_WAL.    + 
2ccb0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20  nPathname + 4 + 
2ccc0 32 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2            /* 
2ccd0 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  zWal */.#endif. 
2cce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
2ccf0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
2cd00 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  NT(SQLITE_INT_TO
2cd10 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65  _PTR(journalFile
2cd20 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20  Size)) );.  if( 
2cd30 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
2cd40 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2cd50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
2cd60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2cd70 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
2cd80 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
2cd90 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
2cda0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2cdb0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
2cdc0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
2cdd0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
2cde0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
2cdf0 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
2ce00 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
2ce10 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
2ce20 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
2ce30 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2ce40 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2ce50 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
2ce60 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
2ce70 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
2ce80 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
2ce90 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
2cea0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2ceb0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
2cec0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2ced0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
2cee0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2cef0 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
2cf00 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
2cf10 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
2cf20 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
2cf30 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
2cf40 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
2cf50 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
2cf60 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  name ){.    asse
2cf70 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20  rt( nPathname>0 
2cf80 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  );.    pPager->z
2cf90 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61  Journal =   (cha
2cfa0 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74  r*)(pPtr += nPat
2cfb0 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69  hname + 1 + nUri
2cfc0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2cfd0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2cfe0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2cff0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
2d000 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70  nUri ) memcpy(&p
2d010 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d020 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a  [nPathname+1], z
2d030 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20  Uri, nUri);.    
2d040 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2d050 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61  Journal, zPathna
2d060 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2d070 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2d080 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d090 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e  thname], "-journ
2d0a0 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20  al\000", 8+2);. 
2d0b0 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
2d0c0 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46  ffix3(pPager->zF
2d0d0 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d  ilename, pPager-
2d0e0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e  >zJournal);.#ifn
2d0f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d100 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  WAL.    pPager->
2d110 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  zWal = &pPager->
2d120 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
2d130 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d  me+8+1];.    mem
2d140 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c  cpy(pPager->zWal
2d150 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2d160 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2d170 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61  cpy(&pPager->zWa
2d180 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
2d190 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a  wal\000", 4+1);.
2d1a0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2d1b0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2d1c0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2d1d0 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a  ->zWal);.#endif.
2d1e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2d1f0 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2d200 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
2d210 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50  Vfs = pVfs;.  pP
2d220 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d  ager->vfsFlags =
2d230 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a   vfsFlags;..  /*
2d240 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
2d250 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
2d260 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d270 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d280 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20    int fout = 0; 
2d290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d2a0 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
2d2b0 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65  returned by xOpe
2d2c0 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n() */.    rc = 
2d2d0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2d2e0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
2d2f0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
2d300 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f  d, vfsFlags, &fo
2d310 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ut);.    assert(
2d320 20 21 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72   !memDb );.    r
2d330 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
2d340 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2d350 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ONLY);..    /* I
2d360 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2d370 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2d380 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2d390 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2d3a0 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2d3b0 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2d3c0 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2d3d0 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2d3e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d3f0 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2d400 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2d410 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2d420 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2d430 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2d440 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2d450 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2d460 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2d470 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2d480 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2d490 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2d4a0 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2d4b0 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2d4c0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2d4d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2d4e0 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2d4f0 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
2d500 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2d510 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2d520 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2d530 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2d540 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2d550 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2d560 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2d570 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2d580 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2d590 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45  ectorSize>SQLITE
2d5a0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2d5b0 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
2d5c0 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2d5d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2d5e0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2d5f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d600 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2d610 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2d620 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2d630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d640 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d650 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2d660 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  E.      {.      
2d670 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2d680 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2d690 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2d6a0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20  r->fd);.        
2d6b0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20  int ii;.        
2d6c0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2d6d0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2d6e0 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2d6f0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2d700 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2d710 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2d720 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2d730 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2d740 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2d750 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
2d760 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2d770 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2d780 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2d790 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2d7a0 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
2d7b0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2d7c0 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
2d7d0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2d7e0 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2d7f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2d800 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2d810 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2d820 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
2d830 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
2d840 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
2d850 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
2d860 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
2d870 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
2d880 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
2d890 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
2d8a0 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
2d8b0 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
2d8c0 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
2d8d0 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
2d8e0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
2d8f0 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
2d900 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
2d910 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
2d920 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
2d930 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
2d940 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
2d950 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
2d960 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
2d970 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
2d980 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
2d990 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
2d9a0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
2d9b0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
2d9c0 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2d9d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2d9e0 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
2d9f0 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
2da00 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
2da10 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  ;.    readOnly =
2da20 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2da30 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2da40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2da50 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2da60 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2da70 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2da80 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2da90 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2daa0 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2dab0 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2dac0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2dad0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2dae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2daf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2db00 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2db10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2db20 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2db30 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2db40 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2db50 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2db60 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2db70 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2db80 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  urred in either 
2db90 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
2dba0 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20  ove, free the . 
2dbb0 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   ** Pager struct
2dbc0 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2dbd0 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2dbe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2dbf0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2dc00 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
2dc10 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ce );.    sqlite
2dc20 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
2dc30 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
2dc40 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
2dc50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2dc60 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2dc70 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2dc80 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73 65  bject. */.  asse
2dc90 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20  rt( nExtra<1000 
2dca0 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52 4f  );.  nExtra = RO
2dcb0 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20  UND8(nExtra);.  
2dcc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2dcd0 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2dce0 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd00 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
2dd10 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
2dd20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2dd30 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47  pPCache);..  PAG
2dd40 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2dd50 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2dd60 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2dd70 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2dd80 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2dd90 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2dda0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2ddb0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2ddc0 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2ddd0 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2dde0 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67  urnal;.  /* pPag
2ddf0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
2de00 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2de10 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
2de20 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2de30 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
2de40 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
2de50 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2de60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
2de70 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2de80 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
2de90 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2dea0 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
2deb0 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
2dec0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
2ded0 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
2dee0 4b 3b 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  K; */.#if 0.  as
2def0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2df00 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
2df10 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
2df20 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
2df30 4b 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  K) );.#endif.  /
2df40 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
2df50 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
2df60 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
2df70 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
2df80 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
2df90 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2dfa0 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
2dfb0 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
2dfc0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2dfd0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
2dfe0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2dff0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2e000 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
2e010 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
2e020 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
2e030 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
2e040 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
2e050 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2e060 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
2e070 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
2e080 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
2e090 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
2e0a0 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73  ly;.  assert( us
2e0b0 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67  eJournal || pPag
2e0c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
2e0d0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
2e0e0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2e0f0 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
2e100 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2e110 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e120 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a  >fullSync==0 );.
2e130 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e140 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30  er->syncFlags==0
2e150 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e160 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2e170 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61  lags==0 );.    a
2e180 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63  ssert( pPager->c
2e190 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  kptSyncFlags==0 
2e1a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2e1b0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
2e1c0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2e1d0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2e1e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2e1f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2e200 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2e210 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2e220 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2e230 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2e240 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2e250 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2e260 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2e270 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2e280 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e290 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2e2a0 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2e2b0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2e2c0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2e2d0 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2e2e0 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2e2f0 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2e300 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2e310 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2e320 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2e330 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2e340 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2e350 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2e360 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2e370 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2e380 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2e390 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2e3a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2e3b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2e3c0 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2e3d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2e3e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2e3f0 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2e400 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2e410 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2e420 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2e430 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2e440 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2e450 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2e460 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28  it;.  /* memset(
2e470 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
2e480 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
2e490 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2f  >aHash)); */.  /
2e4a0 2a 20 70 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70  * pPager->mxMmap
2e4b0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2e4c0 54 5f 4d 4d 41 50 5f 4c 49 4d 49 54 20 2f 2f 20  T_MMAP_LIMIT // 
2e4d0 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62  will be set by b
2e4e0 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70  tree.c */..  *pp
2e4f0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
2e500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e510 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54  OK;.}..../*.** T
2e520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2e530 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
2e540 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
2e550 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
2e560 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
2e570 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
2e580 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
2e590 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
2e5a0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
2e5b0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2e5c0 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
2e5d0 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
2e5e0 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
2e5f0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
2e600 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
2e610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2e620 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
2e630 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
2e640 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
2e650 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
2e660 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
2e670 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
2e680 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
2e690 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
2e6a0 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
2e6b0 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
2e6c0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2e6d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2e6e0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2e6f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e700 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
2e710 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
2e720 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
2e730 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
2e740 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2e750 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2e760 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
2e770 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
2e780 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
2e790 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2e7a0 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
2e7b0 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
2e7c0 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
2e7d0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
2e7e0 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
2e7f0 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
2e800 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
2e810 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
2e820 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
2e830 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
2e840 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
2e850 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
2e860 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
2e870 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
2e880 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2e890 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
2e8a0 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
2e8b0 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
2e8c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
2e8d0 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
2e8e0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
2e8f0 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
2e900 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
2e910 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
2e920 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
2e930 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2e940 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
2e950 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
2e960 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
2e970 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
2e980 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
2e990 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
2e9a0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
2e9b0 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
2e9c0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
2e9d0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2e9e0 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
2e9f0 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
2ea00 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
2ea10 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
2ea20 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
2ea30 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
2ea40 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
2ea50 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2ea60 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
2ea70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2ea80 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
2ea90 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
2eaa0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
2eab0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
2eac0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
2ead0 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
2eae0 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
2eaf0 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
2eb00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2eb10 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
2eb20 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
2eb30 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
2eb40 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
2eb50 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
2eb60 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
2eb70 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
2eb80 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
2eb90 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
2eba0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
2ebb0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
2ebc0 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
2ebd0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2ebe0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2ebf0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
2ec00 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
2ec10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ec20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
2ec30 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
2ec40 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
2ec50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2ec60 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
2ec70 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2ec80 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
2ec90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2eca0 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
2ecb0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2ecc0 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
2ecd0 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
2ece0 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
2ecf0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2ed00 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2ed10 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
2ed20 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
2ed30 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
2ed40 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
2ed50 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
2ed60 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
2ed70 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
2ed80 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
2ed90 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
2eda0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
2edb0 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
2edc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2edd0 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
2ede0 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
2edf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2ee00 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
2ee10 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2ee20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
2ee30 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
2ee40 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
2ee50 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
2ee60 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
2ee70 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
2ee80 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
2ee90 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
2eea0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
2eeb0 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
2eec0 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
2eed0 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
2eee0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
2eef0 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
2ef00 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
2ef10 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
2ef20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
2ef30 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
2ef40 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
2ef50 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
2ef60 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
2ef70 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
2ef80 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
2ef90 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
2efa0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
2efb0 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
2efc0 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
2efd0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
2efe0 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
2eff0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
2f000 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
2f010 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
2f020 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
2f030 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f040 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2f050 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
2f060 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
2f070 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f080 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
2f090 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
2f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2f0c0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
2f0d0 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  ile */..      /*
2f0e0 20 43 68 65 63 6b 20 74 68 65 20 73 69 7a 65 20   Check the size 
2f0f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2f100 66 69 6c 65 2e 20 49 66 20 69 74 20 63 6f 6e 73  file. If it cons
2f110 69 73 74 73 20 6f 66 20 30 20 70 61 67 65 73 2c  ists of 0 pages,
2f120 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64  .      ** then d
2f130 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
2f140 6c 20 66 69 6c 65 2e 20 53 65 65 20 74 68 65 20  l file. See the 
2f150 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61  header comment a
2f160 62 6f 76 65 20 66 6f 72 20 0a 20 20 20 20 20 20  bove for .      
2f170 2a 2a 20 74 68 65 20 72 65 61 73 6f 6e 69 6e 67  ** the reasoning
2f180 20 68 65 72 65 2e 20 20 44 65 6c 65 74 65 20 74   here.  Delete t
2f190 68 65 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  he obsolete jour
2f1a0 6e 61 6c 20 66 69 6c 65 20 75 6e 64 65 72 0a 20  nal file under. 
2f1b0 20 20 20 20 20 2a 2a 20 61 20 52 45 53 45 52 56       ** a RESERV
2f1c0 45 44 20 6c 6f 63 6b 20 74 6f 20 61 76 6f 69 64  ED lock to avoid
2f1d0 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73   race conditions
2f1e0 20 61 6e 64 20 74 6f 20 61 76 6f 69 64 20 76 69   and to avoid vi
2f1f0 6f 6c 61 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a  olating.      **
2f200 20 5b 48 33 33 30 32 30 5d 2e 0a 20 20 20 20 20   [H33020]..     
2f210 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
2f220 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2f230 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
2f240 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2f250 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f260 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
2f270 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2f280 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
2f290 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
2f2a0 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44    if( pagerLockD
2f2b0 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
2f2c0 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45  ED_LOCK)==SQLITE
2f2d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2f2e0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
2f2f0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
2f300 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
2f310 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2f320 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2f330 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c  eMode ) pagerUnl
2f340 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
2f350 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
2f360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2f370 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
2f380 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
2f390 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f3a0 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
2f3b0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
2f3c0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
2f3d0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
2f3e0 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
2f3f0 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
2f400 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
2f410 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
2f420 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
2f430 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
2f440 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
2f450 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
2f460 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
2f470 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
2f480 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2f490 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
2f4a0 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
2f4b0 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
2f4c0 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
2f4d0 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
2f4e0 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
2f4f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2f500 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
2f510 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
2f520 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
2f530 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
2f540 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2f550 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
2f560 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
2f570 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
2f580 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
2f590 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
2f5a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f5b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f5c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f5d0 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20         u8 first 
2f5e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
2f5f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
2f600 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
2f610 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c   (void *)&first,
2f620 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
2f630 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f640 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
2f650 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
2f660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f670 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
2f680 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2f690 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
2f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2f6b0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
2f6c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
2f6d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f6e0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
2f6f0 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20  (first!=0);.    
2f700 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2f710 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
2f720 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  PEN ){.         
2f730 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e     /* If we cann
2f740 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c  ot open the roll
2f750 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
2f760 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  e in order to se
2f770 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  e if.           
2f780 20 2a 2a 20 69 74 73 20 68 61 73 20 61 20 7a 65   ** its has a ze
2f790 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
2f7a0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
2f7b0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
2f7c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2f7d0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
2f7e0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
2f7f0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
2f800 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
2f810 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
2f820 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
2f830 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
2f840 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
2f850 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
2f860 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
2f870 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
2f880 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
2f890 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
2f8a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
2f8b0 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
2f8c0 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
2f8d0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
2f8e0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
2f8f0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
2f900 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
2f910 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
2f920 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
2f930 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
2f940 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
2f950 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
2f960 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
2f970 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
2f980 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
2f990 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2f9a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2f9b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f9c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2f9d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f9e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f9f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2fa00 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
2fa10 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
2fa20 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
2fa30 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
2fa40 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2fa50 65 72 41 63 71 75 69 72 65 28 29 20 75 6e 74 69  erAcquire() unti
2fa60 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  l after this fun
2fa70 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
2fa80 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  n successfully c
2fa90 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61 72  alled. If a shar
2faa0 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  ed-lock is alrea
2fab0 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20  dy held when.** 
2fac0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2fad0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
2fae0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
2faf0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72  e following oper
2fb00 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20  ations are also 
2fb10 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 69  performed by thi
2fb20 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2fb30 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61  *   1) If the pa
2fb40 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
2fb50 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20 73   in PAGER_OPEN s
2fb60 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65  tate (no lock he
2fb70 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68  ld.**      on th
2fb80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
2fb90 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  , then an attemp
2fba0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74  t is made to obt
2fbb0 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48  ain a.**      SH
2fbc0 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ARED lock on the
2fbd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2fbe0 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  Immediately afte
2fbf0 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20  r obtaining.**  
2fc00 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c      the SHARED l
2fc10 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79  ock, the file-sy
2fc20 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20  stem is checked 
2fc30 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
2fc40 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68  l,.**      which
2fc50 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20   is played back 
2fc60 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c  if present. Foll
2fc70 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f  owing any hot-jo
2fc80 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72  urnal .**      r
2fc90 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e  ollback, the con
2fca0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63  tents of the cac
2fcb0 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64  he are validated
2fcc0 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   by checking.** 
2fcd0 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65       the 'change
2fce0 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20  -counter' field 
2fcf0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2fd00 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a  file header and.
2fd10 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65  **      discarde
2fd20 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f  d if they are fo
2fd30 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  und to be invali
2fd40 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66  d..**.**   2) If
2fd50 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
2fd60 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
2fd70 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65  ve-mode, and the
2fd80 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  re are currently
2fd90 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73  .**      no outs
2fda0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2fdb0 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c  es to any pages,
2fdc0 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65   and is in the e
2fdd0 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20  rror state,.**  
2fde0 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65      then an atte
2fdf0 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
2fe00 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
2fe10 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69  tate by discardi
2fe20 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63  ng.**      the c
2fe30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2fe40 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f  age cache and ro
2fe50 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f  lling back any o
2fe60 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  pen journal.**  
2fe70 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20      file..**.** 
2fe80 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
2fe90 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
2fea0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2feb0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2fec0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
2fed0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20  ile locking the 
2fee0 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69  database, checki
2fef0 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ng for a hot-jou
2ff00 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a 2a  rnal file or .**
2ff10 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
2ff20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2ff30 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
2ff40 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2ff50 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2ff60 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
2ff70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2ff80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffa0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2ffb0 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  /..  /* This rou
2ffc0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
2ffd0 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65 20  led from b-tree 
2ffe0 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  and only when th
2fff0 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
30000 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
30010 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73 20  s. This implies 
30020 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 73  that the pager s
30030 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74 68  tate should eith
30040 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e 20  er.  ** be OPEN 
30050 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44 45  or READER. READE
30060 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69 62  R is only possib
30070 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20  le if the pager 
30080 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20 20  is or was in .  
30090 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  ** exclusive acc
300a0 65 73 73 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ess mode..  */. 
300b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
300c0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
300d0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
300e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
300f0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
30100 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
30110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
30120 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
30130 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
30140 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
30150 45 52 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ER );.  if( NEVE
30160 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  R(MEMDB && pPage
30170 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72  r->errCode) ){ r
30180 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
30190 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 69 66 28 20  rCode; }..  if( 
301a0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
301b0 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
301c0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
301d0 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
301e0 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
301f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30200 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
30210 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
30220 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
30230 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 20 20  t( !MEMDB );..  
30240 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
30250 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
30260 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
30270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
30290 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
302a0 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  Lock==NO_LOCK ||
302b0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
302c0 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
302d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
302e0 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
302f0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
30300 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
30310 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
30320 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
30330 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
30340 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
30350 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
30360 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
30370 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
30380 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
30390 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
303a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
303b0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
303c0 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f 75 72  Pager, &bHotJour
303d0 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
303e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
303f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
30400 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
30410 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72 6e 61    if( bHotJourna
30420 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l ){.      if( p
30430 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
30440 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
30450 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
30460 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
30470 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
30480 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
30490 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
304a0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
304b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
304c0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
304d0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
304e0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
304f0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
30500 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
30510 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
30520 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
30530 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
30540 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
30550 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
30560 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
30570 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
30580 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
30590 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
305a0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
305b0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
305c0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
305d0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
305e0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
305f0 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
30600 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
30610 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
30620 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
30630 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
30640 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
30650 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
30660 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
30670 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
30680 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
30690 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
306a0 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
306b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
306c0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
306d0 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
306e0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
306f0 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
30700 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30710 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
30720 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   ** Unless the p
30730 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63 6b 69  ager is in locki
30740 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
30750 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  e mode, the lock
30760 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 6f 77   is.      ** dow
30770 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41 52 45  ngraded to SHARE
30780 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20 74 68  D_LOCK before th
30790 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
307a0 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  rns..      */.  
307b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
307c0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
307d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
307e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
307f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30800 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
30810 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a      }. .      /*
30820 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
30830 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64 20 74  ready open and t
30840 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 20 6f  he file exists o
30850 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74 68 65  n disk, open the
30860 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
30870 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
30880 65 20 61 63 63 65 73 73 2e 20 57 72 69 74 65 20  e access. Write 
30890 61 63 63 65 73 73 20 69 73 20 72 65 71 75 69 72  access is requir
308a0 65 64 20 62 65 63 61 75 73 65 20 0a 20 20 20 20  ed because .    
308b0 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73 69 76    ** in exclusiv
308c0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
308d0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
308e0 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
308f0 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  pen .      ** an
30900 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  d possibly used 
30910 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
30920 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c 73 6f  n later on. Also
30930 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73 20 0a  , write-access .
30940 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 75 61        ** is usua
30950 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  lly required to 
30960 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
30970 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f  rnal in journal_
30980 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a 20 20  mode=persist .  
30990 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61 6e 64      ** mode (and
309a0 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72 6e 61   also for journa
309b0 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 20  l_mode=truncate 
309c0 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 29  on some systems)
309d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
309e0 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   ** If the journ
309f0 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
30a00 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d 65  t, it usually me
30a10 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a 20  ans that some . 
30a20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f       ** other co
30a30 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64  nnection managed
30a40 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72   to get in and r
30a50 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f  oll it back befo
30a60 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  re .      ** thi
30a70 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74  s connection obt
30a80 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73  ained the exclus
30a90 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20  ive lock above. 
30aa0 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  Or, it .      **
30ab0 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74 20 74   may mean that t
30ac0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
30ad0 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
30ae0 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20 20 20  when this.      
30af0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
30b00 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
30b10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
30b20 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20   not exist..    
30b30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
30b40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30b50 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  fd) ){.        s
30b60 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
30b70 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
30b80 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20 20 20  ->pVfs;.        
30b90 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20 20 20  int bExists;    
30ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
30bb0 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
30bc0 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
30bd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30be0 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20  OsAccess(.      
30bf0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
30c00 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
30c10 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
30c20 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b 0a 20  TS, &bExists);. 
30c30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
30c40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45 78 69  QLITE_OK && bExi
30c50 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sts ){.         
30c60 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
30c70 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
30c80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
30c90 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
30ca0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
30cb0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
30cc0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
30cd0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  File );.        
30ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30cf0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
30d00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
30d10 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
30d20 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ut);.          a
30d30 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
30d40 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
30d50 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
30d60 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
30d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
30d80 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
30d90 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
30da0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30db0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
30dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
30dd0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
30de0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
30df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
30e00 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
30e10 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
30e20 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
30e30 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
30e40 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
30e50 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
30e60 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
30e70 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74  ad lock. Purge t
30e80 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a  he cache before.
30e90 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67        ** playing
30ea0 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f   back the hot-jo
30eb0 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65  urnal so that we
30ec0 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69   don't end up wi
30ed0 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69  th.      ** an i
30ee0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
30ef0 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68 6f 74  e.  Sync the hot
30f00 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
30f10 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20 2a 2a  playing.      **
30f20 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65 20 74   it back since t
30f30 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
30f40 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65 66 74  crashed and left
30f50 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
30f60 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62  .      ** probab
30f70 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e 63 20  ly did not sync 
30f80 69 74 20 61 6e 64 20 77 65 20 61 72 65 20 72 65  it and we are re
30f90 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61 79 73  quired to always
30fa0 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a 20 74   sync.      ** t
30fb0 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
30fc0 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62 61 63  e playing it bac
30fd0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
30fe0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
30ff0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
31000 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
31010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
31020 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
31030 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
31040 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
31050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
31060 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
31070 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
31080 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  ck(pPager, 1);. 
31090 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
310a0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
310b0 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OPEN;.        }.
310c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
310d0 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
310e0 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
310f0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28    pagerUnlockDb(
31100 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
31110 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  OCK);.      }.. 
31120 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
31130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31140 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
31150 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61 6e 20   is taken if an 
31160 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
31170 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65  le trying to ope
31180 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20  n.        ** or 
31190 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f 74 2d  roll back a hot-
311a0 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20 68 6f  journal while ho
311b0 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  lding an EXCLUSI
311c0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20  VE lock. The.   
311d0 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 75 6e       ** pager_un
311e0 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  lock() routine w
311f0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ill be called be
31200 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 74  fore returning t
31210 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 20  o unlock.       
31220 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20 49 66   ** the file. If
31230 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74 74 65   the unlock atte
31240 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  mpt fails, then 
31250 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75 73 74  Pager.eLock must
31260 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   be.        ** s
31270 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
31280 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f 6d 6d  CK (see the comm
31290 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
312a0 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20 20 20  efine for .     
312b0 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f     ** UNKNOWN_LO
312c0 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61 6e 20  CK above for an 
312d0 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20 0a 20  explanation). . 
312e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
312f0 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f    ** In order to
31300 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c 6f 63   get pager_unloc
31310 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73 2c 20  k() to do this, 
31320 73 65 74 20 50 61 67 65 72 2e 65 53 74 61 74 65  set Pager.eState
31330 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 50   to.        ** P
31340 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77 2e 20  AGER_ERROR now. 
31350 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
31360 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61 73 20  ally counted as 
31370 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 20  a transition.   
31380 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52 4f 52       ** to ERROR
31390 20 73 74 61 74 65 20 69 6e 20 74 68 65 20 73 74   state in the st
313a0 61 74 65 20 64 69 61 67 72 61 6d 20 61 74 20 74  ate diagram at t
313b0 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 20 66  he top of this f
313c0 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  ile,.        ** 
313d0 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
313e0 61 74 20 74 68 65 20 73 61 6d 65 20 63 61 6c 6c  at the same call
313f0 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
31400 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20 20 20  () will very.   
31410 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c 79 20       ** shortly 
31420 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65 20 70  transition the p
31430 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  ager object to t
31440 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 43  he OPEN state. C
31450 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  alling.        *
31460 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  * assert_pager_s
31470 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66 61 69  tate() would fai
31480 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73 68 6f  l now, as it sho
31490 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  uld not be possi
314a0 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ble.        ** t
314b0 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20 73 74  o be in ERROR st
314c0 61 74 65 20 77 68 65 6e 20 74 68 65 72 65 20 61  ate when there a
314d0 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61 6e 64  re zero outstand
314e0 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20 20 20  ing page .      
314f0 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e    ** references.
31500 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
31510 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
31520 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
31530 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31540 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31560 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31570 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  PEN );.      ass
31580 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
31590 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
315a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
315b0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
315c0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
315d0 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ->eLock>SHARED_L
315e0 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  OCK).      );.  
315f0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
31600 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26  ager->tempFile &
31610 26 20 28 0a 20 20 20 20 20 20 20 20 70 50 61 67  & (.        pPag
31620 65 72 2d 3e 70 42 61 63 6b 75 70 20 0a 20 20 20  er->pBackup .   
31630 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63    || sqlite3Pcac
31640 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
31650 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a  er->pPCache)>0 .
31660 20 20 20 20 20 7c 7c 20 55 53 45 46 45 54 43 48       || USEFETCH
31670 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 29 7b  (pPager).    )){
31680 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
31690 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
316a0 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
316b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
316c0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
316d0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
316e0 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
316f0 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
31700 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
31710 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
31720 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
31730 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
31740 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
31750 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
31760 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
31770 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
31780 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
31790 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
317a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
317b0 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
317c0 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
317d0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
317e0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
317f0 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
31800 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
31810 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
31820 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
31830 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
31840 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
31850 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
31860 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
31870 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
31880 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
31890 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
318a0 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
318b0 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
318c0 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
318d0 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
318e0 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
318f0 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
31900 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
31910 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
31920 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
31930 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
31940 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
31950 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
31960 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
31970 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
31980 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
31990 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
319a0 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a  Pgno nPage = 0;.
319b0 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
319c0 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
319d0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
319e0 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ];..      rc = p
319f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
31a00 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
31a10 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
31a20 74 6f 20 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20  to failed;..    
31a30 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b    if( nPage>0 ){
31a40 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
31a50 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
31a60 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
31a70 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
31a80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
31a90 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
31aa0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
31ab0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
31ac0 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
31ad0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31ae0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
31af0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
31b00 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
31b10 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31b20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31b40 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
31b50 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
31b60 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
31b70 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
31b80 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
31b90 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
31ba0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
31bb0 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
31bc0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
31bd0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
31be0 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74        /* Unmap t
31bf0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31c00 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
31c10 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70   that external p
31c20 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20  rocesses.       
31c30 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75   ** may have tru
31c40 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62  ncated the datab
31c50 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
31c60 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61  n extended it ba
31c70 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ck.        ** to
31c80 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
31c90 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ze while this pr
31ca0 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f  ocess was not ho
31cb0 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20  lding a lock..  
31cc0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
31cd0 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20   case there may 
31ce0 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d  exist a Pager.pM
31cf0 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ap mapping that 
31d00 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20  appears.        
31d10 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67  ** to be the rig
31d20 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e  ht size but is n
31d30 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69  ot actually vali
31d40 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20  d. Avoid this.  
31d50 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69        ** possibi
31d60 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e  lity by unmappin
31d70 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a  g the db here. *
31d80 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53  /.        if( US
31d90 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
31da0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
31db0 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
31dc0 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
31dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31de0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
31df0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41  If there is a WA
31e00 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  L file in the fi
31e10 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20  le-system, open 
31e20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e  this database in
31e30 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65   WAL.    ** mode
31e40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
31e50 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
31e60 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  ion call is a no
31e70 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  -op..    */.    
31e80 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61  rc = pagerOpenWa
31e90 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65  lIfPresent(pPage
31ea0 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
31eb0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
31ec0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31ed0 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  pWal==0 || rc==S
31ee0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64  QLITE_OK );.#end
31ef0 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  if.  }..  if( pa
31f00 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
31f10 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
31f20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31f30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
31f40 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
31f50 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
31f60 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
31f70 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
31f80 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PEN && rc==SQLIT
31f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
31fa0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
31fb0 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
31fc0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
31fd0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
31fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31ff0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
32000 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75  B );.    pager_u
32010 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
32020 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
32030 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
32040 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65  _OPEN );.  }else
32050 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
32060 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
32070 44 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  DER;.  }.  retur
32080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
32090 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
320a0 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
320b0 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
320c0 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
320d0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
320e0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
320f0 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
32100 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
32110 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
32120 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
32130 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
32140 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
32150 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
32160 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
32170 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
32180 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
32190 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
321a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
321b0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
321c0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
321d0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
321e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d   if( pPager->nMm
321f0 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c  apOut==0 && (sql
32200 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
32210 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
32220 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
32230 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
32240 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
32250 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
32260 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
32270 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
32280 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
32290 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
322a0 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
322b0 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
322c0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
322d0 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
322e0 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
322f0 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
32300 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
32310 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
32320 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
32330 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
32340 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
32350 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
32360 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
32370 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
32380 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
32390 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
323a0 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
323b0 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
323c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
323d0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
323e0 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
323f0 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
32400 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
32410 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
32420 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
32430 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
32440 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
32450 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
32460 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
32470 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
32480 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
32490 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
324a0 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
324b0 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
324c0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
324d0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
324e0 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
324f0 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
32500 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
32510 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
32520 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
32530 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
32540 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
32550 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
32560 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
32570 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
32580 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
32590 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
325a0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
325b0 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
325c0 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
325d0 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
325e0 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
325f0 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
32600 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
32610 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
32620 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
32630 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
32640 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
32650 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
32660 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
32670 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
32680 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
32690 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
326a0 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
326b0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
326c0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
326d0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
326e0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
326f0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
32700 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
32710 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61 74 65   in two seperate
32720 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
32730 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
32740 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
32750 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
32760 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
32770 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
32780 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
32790 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
327a0 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
327b0 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
327c0 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
327d0 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
327e0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
327f0 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
32800 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
32810 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
32820 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
32830 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
32840 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
32850 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
32860 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
32870 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
32880 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
32890 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
328a0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
328b0 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
328c0 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
328d0 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
328e0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
328f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
32900 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
32910 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
32920 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
32930 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
32940 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
32950 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
32960 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
32970 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
32980 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
32990 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
329a0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
329b0 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
329c0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
329d0 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
329e0 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
329f0 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
32a00 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
32a10 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
32a20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
32a30 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
32a40 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
32a50 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
32a60 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
32a70 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
32a80 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
32a90 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
32aa0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
32ab0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
32ac0 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
32ad0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
32ae0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
32af0 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
32b00 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
32b10 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
32b20 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
32b30 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
32b40 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
32b50 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
32b60 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
32b70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
32b80 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
32b90 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
32ba0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
32bb0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
32bc0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
32bd0 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
32be0 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
32bf0 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
32c00 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
32c10 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
32c20 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
32c30 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
32c40 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
32c50 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
32c60 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
32c70 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
32c80 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
32c90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
32ca0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
32cb0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
32cc0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
32cd0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
32ce0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
32cf0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
32d00 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
32d10 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
32d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
32d30 47 45 52 5f 41 43 51 55 49 52 45 5f 58 58 58 20  GER_ACQUIRE_XXX 
32d40 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  flags */.){.  in
32d50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
32d60 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ;.  PgHdr *pPg =
32d70 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65   0;.  u32 iFrame
32d80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32d90 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74        /* Frame t
32da0 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20  o read from WAL 
32db0 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  file */.  const 
32dc0 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20  int noContent = 
32dd0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 41  (flags & PAGER_A
32de0 43 51 55 49 52 45 5f 4e 4f 43 4f 4e 54 45 4e 54  CQUIRE_NOCONTENT
32df0 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  );..  /* It is a
32e00 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
32e10 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
32e20 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
32e30 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
32e40 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
32e50 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
32e60 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
32e70 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
32e80 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
32e90 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
32ea0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
32eb0 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
32ec0 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
32ed0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
32ee0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
32ef0 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
32f00 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
32f10 67 6e 6f 21 3d 31 20 26 26 20 55 53 45 46 45 54  gno!=1 && USEFET
32f20 43 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26  CH(pPager).   &&
32f30 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65   (pPager->eState
32f40 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c  ==PAGER_READER |
32f50 7c 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  | (flags & PAGER
32f60 5f 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c  _ACQUIRE_READONL
32f70 59 29 29 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  Y)).  );..  asse
32f80 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32f90 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
32fa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
32fb0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
32fc0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
32fd0 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d  sert( noContent=
32fe0 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30  =0 || bMmapOk==0
32ff0 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d   );..  if( pgno=
33000 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
33010 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
33020 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
33030 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
33040 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
33050 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  te, return an er
33060 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ror immediately.
33070 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
33080 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61  , request the pa
33090 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63  ge from the PCac
330a0 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69  he layer. */.  i
330b0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
330c0 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  de!=SQLITE_OK ){
330d0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
330e0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
330f0 73 65 7b 0a 0a 20 20 20 20 69 66 28 20 62 4d 6d  se{..    if( bMm
33100 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65  apOk && pagerUse
33110 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
33120 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33130 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50  3WalFindFrame(pP
33140 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f  ager->pWal, pgno
33150 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
33160 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33170 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72  _OK ) goto pager
33180 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
33190 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 46 72    }..    if( iFr
331a0 61 6d 65 3d 3d 30 20 26 26 20 62 4d 6d 61 70 4f  ame==0 && bMmapO
331b0 6b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  k ){.      void 
331c0 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20 20  *pData = 0;..   
331d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
331e0 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  sFetch(pPager->f
331f0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 69  d, .          (i
33200 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
33210 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
33220 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
33230 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20 20 29  , &pData.      )
33240 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
33250 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
33260 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ata ){.        i
33270 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
33280 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  e>PAGER_READER )
33290 7b 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  {.          (voi
332a0 64 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  d)sqlite3PcacheF
332b0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
332c0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
332d0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pPg);.        }.
332e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d          if( pPg=
332f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
33300 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
33310 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c  eMapPage(pPager,
33320 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70   pgno, pData, &p
33330 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Pg);.        }el
33340 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
33350 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
33360 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29  Pager->fd, (i64)
33370 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  (pgno-1)*pPager-
33380 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
33390 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
333a0 20 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a       if( pPg ){.
333b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
333c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
333d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70  );.          *pp
333e0 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Page = pPg;.    
333f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
33400 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
33410 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
33420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
33440 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
33450 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
33460 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   }..    rc = sql
33470 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
33480 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
33490 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65   pgno, 1, ppPage
334a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
334b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
334c0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
334d0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
334e0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
334f0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
33500 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
33510 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
33520 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
33530 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
33540 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
33550 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
33560 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
33570 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
33580 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
33590 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
335a0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
335b0 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
335c0 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
335d0 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
335e0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
335f0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
33600 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70   || (*ppPage)->p
33610 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
33620 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  f( (*ppPage)->pP
33630 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
33640 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
33650 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
33660 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
33670 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
33680 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
33690 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
336a0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
336b0 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
336c0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
336d0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
336e0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
336f0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
33700 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
33710 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
33720 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
33730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
33740 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
33750 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
33760 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
33770 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
33780 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
33790 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
337a0 2e 20 20 2a 2f 0a 0a 20 20 20 20 70 50 67 20 3d  .  */..    pPg =
337b0 20 2a 70 70 50 61 67 65 3b 0a 20 20 20 20 70 50   *ppPage;.    pP
337c0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
337d0 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  er;..    /* The 
337e0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
337f0 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
33800 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
33810 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 20  PT if a page.   
33820 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
33830 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
33840 20 74 68 65 20 75 6e 75 73 65 64 20 6c 6f 63 6b   the unused lock
33850 69 6e 67 2d 70 61 67 65 2c 20 69 73 20 72 65 71  ing-page, is req
33860 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
33870 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
33880 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
33890 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
338a0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
338b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
338c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
338d0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
338e0 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
338f0 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
33900 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
33910 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
33920 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
33930 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20  r->fd) ){.      
33940 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
33950 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
33960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
33970 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ULL;.        got
33980 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
33990 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
339a0 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74     if( noContent
339b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
339c0 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68  ailure to set th
339d0 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e  e bits in the In
339e0 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74  Journal bit-vect
339f0 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20  ors is benign.. 
33a00 20 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72         ** It mer
33a10 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ely means that w
33a20 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20  e might do some 
33a30 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f  extra work to jo
33a40 75 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20  urnal a .       
33a50 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f   ** page that do
33a60 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
33a70 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65  e journaled.  Ne
33a80 76 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73  vertheless, be s
33a90 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
33aa0 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65  to test the case
33ab0 20 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20   where a malloc 
33ac0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
33ad0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74  le trying to set
33ae0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62   .        ** a b
33af0 69 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74  it in a bit vect
33b00 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
33b10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
33b20 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
33b30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
33b40 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
33b50 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  rigSize ){.     
33b60 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
33b70 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74  c = ) sqlite3Bit
33b80 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
33b90 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29  InJournal, pgno)
33ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
33bb0 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
33bc0 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
33bd0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54    }.        TEST
33be0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64  ONLY( rc = ) add
33bf0 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
33c00 63 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  cs(pPager, pgno)
33c10 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
33c20 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
33c30 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
33c40 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
33c50 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
33c60 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
33c70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
33c80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
33c90 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
33ca0 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
33cb0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
33cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33cd0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
33ce0 28 70 50 61 67 65 72 29 20 26 26 20 62 4d 6d 61  (pPager) && bMma
33cf0 70 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pOk==0 ){.      
33d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
33d10 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
33d20 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
33d30 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  iFrame);.       
33d40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33d50 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f  OK ) goto pager_
33d60 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
33d70 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
33d80 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
33d90 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20  pPager );.      
33da0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
33db0 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b  GER_STAT_MISS]++
33dc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ;.      rc = rea
33dd0 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46 72  dDbPage(pPg, iFr
33de0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
33df0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33e00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
33e10 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
33e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33e30 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
33e40 65 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a  ehash(pPg);.  }.
33e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
33e60 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
33e70 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
33e80 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33e90 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
33ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
33eb0 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
33ec0 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
33ed0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
33ee0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
33ef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33f00 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
33f10 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
33f20 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
33f30 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
33f40 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
33f50 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
33f60 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
33f70 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
33f80 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
33f90 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
33fa0 61 63 68 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65  ache. .**.** See
33fb0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
33fc0 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
33fd0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
33fe0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
33ff0 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
34000 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
34010 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
34020 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
34030 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
34040 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
34050 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
34060 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
34070 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
34080 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
34090 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
340a0 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
340b0 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
340c0 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
340d0 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
340e0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
340f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
34100 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
34110 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65  *pPg = 0;.  asse
34120 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
34130 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
34140 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34150 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 21  pPager->pPCache!
34160 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34170 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
34180 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
34190 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
341a0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
341b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
341c0 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
341d0 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
341e0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg);.  return pP
341f0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
34200 61 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72  ase a page refer
34210 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ence..**.** If t
34220 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
34230 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
34240 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f  age drop to zero
34250 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61  , then the.** pa
34260 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ge is added to t
34270 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68  he LRU list.  Wh
34280 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  en all reference
34290 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a  s to all pages.*
342a0 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20  * are released, 
342b0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
342c0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
342d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
342e0 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  s.** removed..*/
342f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
34300 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
34310 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
34320 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
34330 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
34340 65 72 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  er;.    if( pPg-
34350 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d  >flags & PGHDR_M
34360 4d 41 50 20 29 7b 0a 20 20 20 20 20 20 70 61 67  MAP ){.      pag
34370 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
34380 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
34390 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
343a0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
343b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  );.    }.    pag
343c0 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
343d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
343e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
343f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61  tion is called a
34400 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
34410 76 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73  very write trans
34420 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65  action..** There
34430 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65   must already be
34440 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
34450 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
34460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
34470 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  * file when this
34480 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
34490 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74  ed..**.** Open t
344a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
344b0 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
344c0 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75   and write a jou
344d0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74  rnal header.** t
344e0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
344f0 74 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  t. If there are 
34500 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
34510 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d  s, open the sub-
34520 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65  journal.** as we
34530 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
34540 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77  n is only used w
34550 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
34560 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a  file is being .*
34570 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74  * opened to writ
34580 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67  e a rollback log
34590 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
345a0 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73  on. It is not us
345b0 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e  ed .** when open
345c0 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ing a hot journa
345d0 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69  l file to roll i
345e0 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
345f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34600 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
34610 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  n (as it may be 
34620 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
34630 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  e),.** then this
34640 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77   function just w
34650 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20  rites a journal 
34660 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74  header to the st
34670 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c  art of the.** al
34680 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e  ready open file.
34690 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20   .**.** Whether 
346a0 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
346b0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
346c0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
346d0 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  on, the.** Pager
346e0 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76  .pInJournal bitv
346f0 65 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ec structure is 
34700 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
34710 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
34720 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
34730 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f  is successful. O
34740 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
34750 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
34760 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74  M if the attempt
34770 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67   to allocate Pag
34780 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61  er.pInJournal fa
34790 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49  ils, or .** an I
347a0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  O error code if 
347b0 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69  opening or writi
347c0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
347d0 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74  ile fails..*/.st
347e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
347f0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
34800 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
34810 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
34820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34830 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
34840 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
34850 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
34860 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
34870 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c  pVfs;   /* Local
34880 20 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f   cache of vfs po
34890 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  inter */..  asse
348a0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
348b0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
348c0 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73  _LOCKED );.  ass
348d0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
348e0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
348f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34900 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
34910 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66  =0 );.  .  /* If
34920 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34930 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69  error state, thi
34940 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
34950 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20  no-op.  But on. 
34960 20 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61   ** the other ha
34970 6e 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nd, this routine
34980 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
34990 20 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   if we are alrea
349a0 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72  dy in.  ** an er
349b0 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  ror state. */.  
349c0 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
349d0 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
349e0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
349f0 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67  ode;..  if( !pag
34a00 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
34a10 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
34a20 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
34a30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
34a40 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  {.    pPager->pI
34a50 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
34a60 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
34a70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
34a80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
34a90 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
34aa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
34ab0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
34ac0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
34ad0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34ae0 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
34af0 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
34b00 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
34b10 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
34b20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
34b30 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
34b40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
34b50 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
34b60 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
34b70 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
34b80 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
34b90 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  se{.        cons
34ba0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
34bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bc0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
34bd0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
34be0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 53  e */.          S
34bf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
34c00 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
34c10 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
34c20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
34c30 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
34c40 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
34c50 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
34c60 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
34c70 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
34c80 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50        (SQLITE_OP
34c90 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
34ca0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
34cb0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
34cc0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
34cd0 45 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  E.        rc = s
34ce0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
34cf0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  n(.            p
34d00 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
34d10 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
34d20 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
34d30 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
34d40 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 23  ).        );.  #
34d50 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
34d60 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
34d70 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
34d80 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
34d90 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
34da0 20 20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d    #endif.      }
34db0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
34dc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
34dd0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
34de0 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  fd) );.    }.  .
34df0 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
34e00 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
34e10 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
34e20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
34e30 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   open .    ** th
34e40 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
34e50 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20   necessary..    
34e60 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
34e70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34e80 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
34e90 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
34ea0 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
34eb0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ired. */.      p
34ec0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
34ed0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
34ee0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
34ef0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
34f00 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
34f10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
34f20 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lHdr = 0;.      
34f30 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
34f40 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
34f50 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
34f60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34f70 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
34f80 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
34f90 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
34fa0 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
34fb0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  rnal = 0;.  }els
34fc0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
34fd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
34fe0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
34ff0 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ED );.    pPager
35000 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
35010 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
35020 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
35030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
35040 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
35050 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70  action on the sp
35060 65 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62  ecified pager ob
35070 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77  ject. If a .** w
35080 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
35090 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
350a0 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66  n opened, this f
350b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
350c0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  op..**.** If the
350d0 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74   exFlag argument
350e0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
350f0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
35100 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c   a RESERVED.** l
35110 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
35120 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46  ase file. If exF
35130 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
35140 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
35150 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49  st.** an EXCLUSI
35160 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68  VE lock. If such
35170 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61   a lock is alrea
35180 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b  dy held, no lock
35190 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ing .** function
351a0 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64  s need be called
351b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
351c0 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75  ubjInMemory argu
351d0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ment is non-zero
351e0 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a  , then any sub-j
351f0 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a  ournal opened.**
35200 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
35210 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
35220 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e   opened as an in
35230 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68  -memory file. Th
35240 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66  is.** has no eff
35250 65 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a  ect if the sub-j
35260 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64  ournal is alread
35270 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20  y opened (as it 
35280 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72  may be when.** r
35290 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
352a0 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20  ive mode) or if 
352b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
352c0 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
352d0 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61   a.** sub-journa
352e0 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e  l. If the subjIn
352f0 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20  Memory argument 
35300 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e  is zero, then an
35310 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75  y required.** su
35320 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70  b-journal is imp
35330 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f  lemented in-memo
35340 72 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20  ry if pPager is 
35350 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
35360 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73  abase, .** or us
35370 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ing a temporary 
35380 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  file otherwise..
35390 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
353a0 67 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a  gerBegin(Pager *
353b0 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c  pPager, int exFl
353c0 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65  ag, int subjInMe
353d0 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  mory){.  int rc 
353e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
353f0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
35400 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61  ode ) return pPa
35410 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
35420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35430 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
35440 41 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e  ADER && pPager->
35450 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52  eState<PAGER_ERR
35460 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OR );.  pPager->
35470 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28  subjInMemory = (
35480 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b  u8)subjInMemory;
35490 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
354a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
354b0 41 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a  AGER_READER) ){.
354c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
354d0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
354e0 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61  0 );..    if( pa
354f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
35500 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
35510 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f   the pager is co
35520 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20  nfigured to use 
35530 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
35540 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20  lusive, and an. 
35550 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
35560 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
35570 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c  tabase is not al
35580 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61  ready held, obta
35590 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20  in it now..     
355a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
355b0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
355c0 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61  ode && sqlite3Wa
355d0 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
355e0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29  Pager->pWal, -1)
355f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35600 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
35610 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
35620 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
35630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
35650 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
35660 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
35670 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
35680 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
35690 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
356a0 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
356b0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
356c0 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
356d0 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
356e0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
356f0 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
35700 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
35710 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
35720 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
35730 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
35740 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
35750 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
35760 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
35770 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
35780 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
35790 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
357a0 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
357b0 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
357c0 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
357d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
357e0 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
357f0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
35800 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
35810 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
35820 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
35830 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
35840 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
35850 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
35860 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
35870 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
35880 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
35890 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
358a0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
358b0 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
358c0 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
358d0 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
358e0 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
358f0 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
35900 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
35910 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
35920 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
35930 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
35940 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
35950 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
35960 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
35970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
35980 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
35990 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
359a0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
359b0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
359c0 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
359d0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
359e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
359f0 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
35a00 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
35a10 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
35a20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
35a30 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
35a40 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
35a50 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
35a60 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
35a70 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
35a80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
35a90 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
35aa0 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
35ab0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
35ac0 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
35ad0 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
35ae0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
35af0 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
35b00 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
35b10 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
35b20 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
35b30 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
35b40 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
35b50 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
35b60 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
35b70 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
35b80 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
35b90 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
35ba0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35bb0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
35bc0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
35bd0 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
35be0 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
35bf0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
35c00 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
35c10 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
35c20 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
35c30 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
35c40 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
35c50 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
35c60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
35c70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
35c80 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
35c90 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
35ca0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
35cb0 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
35cc0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
35cd0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
35ce0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35cf0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
35d00 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
35d10 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
35d20 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
35d30 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
35d40 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
35d50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
35d60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
35d70 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
35d80 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
35d90 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
35da0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
35db0 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
35dc0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
35dd0 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
35de0 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
35df0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
35e00 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
35e10 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
35e20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
35e30 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
35e40 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
35e50 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
35e60 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
35e70 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
35e80 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
35e90 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
35ea0 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
35eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35ec0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
35ed0 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
35ee0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
35ef0 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
35f00 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
35f10 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
35f20 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
35f30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
35f40 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73  not called unles
35f50 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
35f60 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
35f70 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20 73 74 61  y .  ** been sta
35f80 72 74 65 64 2e 20 54 68 65 20 6a 6f 75 72 6e 61  rted. The journa
35f90 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  l file may or ma
35fa0 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 20 61 74  y not be open at
35fb0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
35fc0 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 63 61  * It is never ca
35fd0 6c 6c 65 64 20 69 6e 20 74 68 65 20 45 52 52 4f  lled in the ERRO
35fe0 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 20 20  R state..  */.  
35ff0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36000 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
36010 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20  ITER_LOCKED.    
36020 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
36030 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36040 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
36050 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
36060 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
36070 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
36080 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
36090 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
360a0 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  r) );..  /* If a
360b0 6e 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  n error has been
360c0 20 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65   previously dete
360d0 63 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65  cted, report the
360e0 20 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a   same error.  **
360f0 20 61 67 61 69 6e 2e 20 54 68 69 73 20 73 68 6f   again. This sho
36100 75 6c 64 20 6e 6f 74 20 68 61 70 70 65 6e 2c 20  uld not happen, 
36110 62 75 74 20 74 68 65 20 63 68 65 63 6b 20 70 72  but the check pr
36120 6f 76 69 64 65 73 20 72 6f 62 75 73 74 6e 65 73  ovides robustnes
36130 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
36140 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
36150 65 29 20 29 20 20 72 65 74 75 72 6e 20 70 50 61  e) )  return pPa
36160 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
36170 20 2f 2a 20 48 69 67 68 65 72 2d 6c 65 76 65 6c   /* Higher-level
36180 20 72 6f 75 74 69 6e 65 73 20 6e 65 76 65 72 20   routines never 
36190 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
361a0 6f 6e 20 69 66 20 64 61 74 61 62 61 73 65 20 69  on if database i
361b0 73 20 6e 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61  s not.  ** writa
361c0 62 6c 65 2e 20 20 42 75 74 20 63 68 65 63 6b 20  ble.  But check 
361d0 61 6e 79 77 61 79 2c 20 6a 75 73 74 20 66 6f 72  anyway, just for
361e0 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a   robustness. */.
361f0 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36200 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20  er->readOnly) ) 
36210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
36220 52 4d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47  RM;..  CHECK_PAG
36230 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 54 68  E(pPg);..  /* Th
36240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
36250 65 65 64 73 20 74 6f 20 62 65 20 6f 70 65 6e 65  eeds to be opene
36260 64 2e 20 48 69 67 68 65 72 20 6c 65 76 65 6c 20  d. Higher level 
36270 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 61 6c  routines have al
36280 72 65 61 64 79 0a 20 20 2a 2a 20 6f 62 74 61 69  ready.  ** obtai
36290 6e 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  ned the necessar
362a0 79 20 6c 6f 63 6b 73 20 74 6f 20 62 65 67 69 6e  y locks to begin
362b0 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
362c0 61 63 74 69 6f 6e 2c 20 62 75 74 20 74 68 65 0a  action, but the.
362d0 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f    ** rollback jo
362e0 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
362f0 79 65 74 20 62 65 20 6f 70 65 6e 2e 20 4f 70 65  yet be open. Ope
36300 6e 20 69 74 20 6e 6f 77 20 69 66 20 74 68 69 73  n it now if this
36310 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
36320 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  **.  ** This is 
36330 64 6f 6e 65 20 62 65 66 6f 72 65 20 63 61 6c 6c  done before call
36340 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
36350 65 4d 61 6b 65 44 69 72 74 79 28 29 20 6f 6e 20  eMakeDirty() on 
36360 74 68 65 20 70 61 67 65 2e 20 0a 20 20 2a 2a 20  the page. .  ** 
36370 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 69 74  Otherwise, if it
36380 20 77 65 72 65 20 64 6f 6e 65 20 61 66 74 65 72   were done after
36390 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
363a0 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
363b0 29 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6e 20  ), then.  ** an 
363c0 65 72 72 6f 72 20 6d 69 67 68 74 20 6f 63 63 75  error might occu
363d0 72 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  r and the pager 
363e0 77 6f 75 6c 64 20 65 6e 64 20 75 70 20 69 6e 20  would end up in 
363f0 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74  WRITER_LOCKED st
36400 61 74 65 0a 20 20 2a 2a 20 77 69 74 68 20 70 61  ate.  ** with pa
36410 67 65 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69  ges marked as di
36420 72 74 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  rty in the cache
36430 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
36440 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36450 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36460 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
36470 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
36480 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
36490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
364a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
364b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
364c0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
364d0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
364e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
364f0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
36500 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 2f 2a  pPager) );..  /*
36510 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
36520 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
36530 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
36540 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
36550 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
36560 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
36570 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
36580 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
36590 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
365a0 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
365b0 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
365c0 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
365d0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
365e0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
365f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
36600 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20 20 20 20    }else{.  .    
36610 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
36620 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
36630 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
36640 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
36650 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
36660 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
36670 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
36680 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
36690 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
366a0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
366b0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
366c0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
366d0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
366e0 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
366f0 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
36700 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
36710 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
36720 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
36730 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
36740 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
36750 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  gno<=pPager->dbO
36760 72 69 67 53 69 7a 65 20 26 26 20 69 73 4f 70 65  rigSize && isOpe
36770 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
36780 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
36790 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
367a0 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 20 20 20  r *pData2;.     
367b0 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50     i64 iOff = pP
367c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
367d0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
367e0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
367f0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
36800 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
36810 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
36820 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
36830 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
36840 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
36850 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
36860 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
36870 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
36880 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
36890 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
368a0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  GNO(pPager) );..
368b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
368c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
368d0 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  dr<=pPager->jour
368e0 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
368f0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
36900 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
36910 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
36920 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
36930 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
36940 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
36950 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
36960 74 61 32 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ta2);..        /
36970 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
36980 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
36990 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
369a0 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
369b0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
369c0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
369d0 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
369e0 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
369f0 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
36a00 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
36a10 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
36a20 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
36a30 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
36a40 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
36a50 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
36a60 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
36a70 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
36a80 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
36a90 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
36aa0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
36ab0 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
36ac0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
36ad0 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
36ae0 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
36af0 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
36b00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
36b10 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
36b20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
36b30 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ..        rc = w
36b40 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
36b50 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
36b60 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
36b70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36b80 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
36b90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
36ba0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
36bb0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
36bc0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
36bd0 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 20  ze, iOff+4);.   
36be0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
36bf0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
36c00 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
36c10 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
36c20 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b 70  ger->jfd, iOff+p
36c30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
36c40 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  4, cksum);.     
36c50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36c60 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
36c70 3b 0a 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ;..        IOTRA
36c80 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20  CE(("JOUT %p %d 
36c90 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
36ca0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  er, pPg->pgno, .
36cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
36cd0 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Off, pPager->pag
36ce0 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20  eSize));.       
36cf0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
36d00 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
36d10 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20  _count);.       
36d20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f   PAGERTRACE(("JO
36d30 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
36d40 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73   needSync=%d has
36d50 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
36d60 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
36d70 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
36d80 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
36d90 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
36da0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
36db0 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67  ?1:0), pager_pag
36dc0 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
36dd0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
36de0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20 2b  ournalOff += 8 +
36df0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
36e00 65 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  e;.        pPage
36e10 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
36e20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
36e30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
36e40 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
36e50 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
36e60 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
36e70 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
36e80 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
36e90 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
36ea0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
36eb0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36ec0 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
36ed0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
36ee0 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
36ef0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
36f00 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
36f10 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
36f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36f30 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
36f40 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
36f50 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
36f60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
36f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
36f80 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
36f90 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
36fa0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
36fb0 4f 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OD ){.          
36fc0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
36fd0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
36fe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36ff0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50   PAGERTRACE(("AP
37000 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
37010 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
37020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37030 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
37040 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
37050 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
37060 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
37070 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b  ED_SYNC)?1:0)));
37080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37090 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
370a0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
370b0 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
370c0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
370d0 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
370e0 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
370f0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
37100 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
37110 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
37120 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
37130 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
37140 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
37150 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
37160 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
37170 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
37180 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
37190 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
371a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
371b0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
371c0 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pPg) ){.      rc
371d0 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
371e0 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pPg);.    }.  
371f0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
37200 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
37210 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
37220 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
37230 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f  dbSize<pPg->pgno
37240 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
37250 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
37260 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  no;.  }.  return
37270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
37280 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
37290 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
372a0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
372b0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
372c0 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
372d0 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
372e0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
372f0 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
37300 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
37310 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
37320 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
37330 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
37340 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
37350 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
37360 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
37370 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
37380 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
37390 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
373a0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
373b0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
373c0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
373d0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
373e0 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
373f0 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
37400 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
37410 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
37420 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
37430 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
37440 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
37450 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
37460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
37470 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
37480 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
37490 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
374a0 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
374b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
374c0 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
374d0 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
374e0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
374f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
37500 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
37510 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
37520 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37530 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
37540 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
37550 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
37560 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
37570 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
37580 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
37590 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
375a0 65 53 69 7a 65 29 3b 0a 0a 20 20 61 73 73 65 72  eSize);..  asser
375b0 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  t( (pPg->flags &
375c0 20 50 47 48 44 52 5f 4d 4d 41 50 29 3d 3d 30 20   PGHDR_MMAP)==0 
375d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
375e0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
375f0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
37610 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
37620 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61  GER_ERROR );.  a
37630 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
37640 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
37650 29 20 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ) );..  if( nPag
37660 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
37670 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
37680 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
37690 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
376a0 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
376b0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
376c0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
376d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
376e0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
376f0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
37700 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
37710 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20  nt nPage = 0;   
37720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37730 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
37740 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
37750 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
37760 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
37770 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
37780 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
37790 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
377a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
377b0 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
377c0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
377d0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
377e0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69  the doNotSyncSpi
377f0 6c 6c 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  ll flag to 1. Th
37800 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
37810 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20   cannot allow.  
37820 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68    ** a journal h
37830 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
37840 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
37850 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
37860 62 79 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  by.    ** this f
37870 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
37880 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
37890 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
378a0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
378b0 79 6e 63 53 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20  yncSpill==0 );. 
378c0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
378d0 53 79 6e 63 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20  SyncSpill++;..  
378e0 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
378f0 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
37900 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
37910 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
37920 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
37930 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
37940 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
37950 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
37960 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
37970 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
37980 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
37990 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
379a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
379b0 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
379c0 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
379d0 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
379e0 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d      nPageCount =
379f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
37a00 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
37a10 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
37a20 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
37a30 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
37a40 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
37a50 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
37a60 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
37a70 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
37a80 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
37a90 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
37aa0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
37ab0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
37ac0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
37ad0 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
37ae0 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
37af0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
37b00 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
37b10 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
37b20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
37b30 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
37b40 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
37b50 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
37b60 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
37b70 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
37b80 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
37b90 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
37ba0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
37bb0 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
37bc0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
37bd0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
37be0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
37bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37c00 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
37c10 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
37c20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
37c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37c40 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
37c50 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
37c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
37c70 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
37c80 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
37c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
37ca0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
37cb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
37cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
37cd0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
37ce0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
37cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
37d00 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
37d10 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
37d20 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
37d30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
37d40 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
37d50 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
37d60 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
37d70 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
37d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
37d90 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
37da0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
37db0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48     /* If the PGH
37dc0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
37dd0 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
37de0 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
37df0 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
37e00 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
37e10 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
37e20 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
37e30 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
37e40 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
37e50 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
37e60 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
37e70 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
37e80 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
37e90 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
37ea0 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
37eb0 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
37ec0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
37ed0 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
37ee0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
37ef0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
37f00 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
37f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37f20 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20  _OK && needSync 
37f30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
37f40 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
37f50 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
37f60 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
37f70 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
37f80 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
37f90 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b  pPager, pg1+ii);
37fa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
37fb0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
37fc0 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
37fd0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
37fe0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
37ff0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
38000 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
38010 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
38020 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
38030 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  ->doNotSyncSpill
38040 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
38050 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c  r->doNotSyncSpil
38060 6c 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l--;.  }else{.  
38070 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
38080 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  te(pDbPage);.  }
38090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
380a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
380b0 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67  UE if the page g
380c0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
380d0 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75  ment was previou
380e0 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f  sly passed.** to
380f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
38100 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
38110 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
38120 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
38130 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
38140 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
38150 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  age..*/.#ifndef 
38160 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74  NDEBUG.int sqlit
38170 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
38180 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  le(DbPage *pPg){
38190 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66  .  return pPg->f
381a0 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
381b0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
381c0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
381d0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
381e0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
381f0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
38200 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
38210 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
38220 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
38230 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
38240 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
38250 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
38260 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
38270 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
38280 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
38290 2a 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20  ** the page has 
382a0 62 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20  been added as a 
382b0 6c 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65  leaf of the free
382c0 6c 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a  list and so its.
382d0 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f  ** content no lo
382e0 6e 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a  nger matters..**
382f0 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
38300 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
38310 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
38320 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
38330 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
38340 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
38350 20 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67   unused. The pag
38360 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
38370 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
38380 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
38390 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
383a0 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
383b0 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
383c0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  s optimization c
383d0 61 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  an quadruple the
383e0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
383f0 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61  .** DELETE opera
38400 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tions..*/.void s
38410 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
38420 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
38430 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
38440 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
38450 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
38460 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
38470 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  && pPager->nSave
38480 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  point==0 ){.    
38490 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
384a0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
384b0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
384c0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
384d0 67 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52  ger)));.    IOTR
384e0 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
384f0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
38500 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50  g->pgno)).    pP
38510 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
38520 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 20 20  R_DONT_WRITE;.  
38530 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
38540 68 61 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 7d  hash(pPg);.  }.}
38550 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
38560 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
38570 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
38580 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
38590 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63  abase file .** c
385a0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73  hange-counter, s
385b0 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74  tored as a 4-byt
385c0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
385d0 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74  eger starting at
385e0 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74   .** byte offset
385f0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
38600 20 66 69 6c 65 2e 20 20 54 68 65 20 73 65 63 6f   file.  The seco
38610 6e 64 61 72 79 20 63 68 61 6e 67 65 20 63 6f 75  ndary change cou
38620 6e 74 65 72 20 61 74 0a 2a 2a 20 39 32 20 69 73  nter at.** 92 is
38630 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2c 20 61   also updated, a
38640 73 20 69 73 20 74 68 65 20 53 51 4c 69 74 65 20  s is the SQLite 
38650 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61  version number a
38660 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a  t offset 96..**.
38670 2a 2a 20 42 75 74 20 74 68 69 73 20 6f 6e 6c 79  ** But this only
38680 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
38690 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
386a0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
386b0 66 61 6c 73 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f  false..** To avo
386c0 69 64 20 65 78 63 65 73 73 20 63 68 75 72 6e 69  id excess churni
386d0 6e 67 20 6f 66 20 70 61 67 65 20 31 2c 20 74 68  ng of page 1, th
386e0 65 20 75 70 64 61 74 65 20 6f 6e 6c 79 20 68 61