/ Hex Artifact Content
Login

Artifact 4e202d93e77cfc8f316a99b5b8b0cd11bc65eb32:


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 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 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 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 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 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 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 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 42 65 65 6e 55 73 65  .  u8 hasBeenUse
7920: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
7930: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 63 6f  * True if any co
7940: 6e 74 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79  ntent previously
7950: 20 72 65 61 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   read */.  Pgno 
7960: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7970: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7980: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7990: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
79a0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
79b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
79c0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
79d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
79e0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
79f0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7a00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7a10: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7a20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7a30: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7a40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7a50: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7a60: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7a70: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7a80: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7a90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7aa0: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7ab0: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7ac0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7ae0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7af0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7b00: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7b10: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7b30: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7b40: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7b50: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7b60: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7b80: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7b90: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7ba0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7bb0: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7bc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7bd0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7be0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7bf0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7c00: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7c10: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7c20: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7c30: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7c40: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7c50: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7c60: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7c70: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7c80: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7c90: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7ca0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7cb0: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7cc0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7cd0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7ce0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7cf0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7d00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7d10: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d30: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
7d40: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
7d50: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
7d60: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
7d70: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
7d80: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
7d90: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
7da0: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
7db0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
7dc0: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
7dd0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
7de0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
7df0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
7e00: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7e10: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
7e20: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
7e30: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
7e40: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
7e50: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
7e60: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
7e70: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
7e80: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
7e90: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
7ec0: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
7ed0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
7ee0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7ef0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
7f00: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
7f10: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
7f20: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
7f30: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
7f40: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
7f50: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
7f60: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
7f70: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
7f80: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
7f90: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
7fa0: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
7fb0: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
7fc0: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
7fd0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8030: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8040: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8050: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8060: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8070: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8080: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
80a0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
80b0: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
80c0: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
80d0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
80e0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
80f0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
8100: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
8110: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
8120: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8130: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8140: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8150: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8180: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8190: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81b0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
81c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
81d0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
81e0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
81f0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
8200: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
8210: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
8220: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8230: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8240: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8250: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8260: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8270: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8280: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8290: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
82a0: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
82b0: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
82c0: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
82d0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
82e0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
82f0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
8300: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
8310: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
8320: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8330: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8340: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8350: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8360: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8370: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8380: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
83a0: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
83b0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
83c0: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
83d0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
83e0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
83f0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
8400: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
8410: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
8420: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
8430: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
8440: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
8450: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
8460: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
8470: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
8480: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
8490: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
84a0: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
84b0: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
84c0: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
84d0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
84e0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
84f0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
8500: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8520: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
8530: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
8540: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
8550: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
8560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8570: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
8580: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
8590: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50  r tmp use */.  P
85a0: 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20  Cache *pPCache; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
85c0: 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63 61  inter to page ca
85d0: 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69  che object */.#i
85e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
85f0: 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61  T_WAL.  Wal *pWa
8600: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8610: 20 20 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65      /* Write-ahe
8620: 61 64 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22  ad log used by "
8630: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
8640: 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61  " */.  char *zWa
8650: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
8660: 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20     /* File name 
8670: 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
8680: 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  log */.#endif.};
8690: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20  ../*.** Indexes 
86a0: 66 6f 72 20 75 73 65 20 77 69 74 68 20 50 61 67  for use with Pag
86b0: 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20  er.aStat[]. The 
86c0: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72  Pager.aStat[] ar
86d0: 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ray contains.** 
86e0: 74 68 65 20 76 61 6c 75 65 73 20 61 63 63 65 73  the values acces
86f0: 73 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 53  sed by passing S
8700: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
8710: 41 43 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f  ACHE_HIT, CACHE_
8720: 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48  MISS .** or CACH
8730: 45 5f 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74  E_WRITE to sqlit
8740: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a  e3_db_status()..
8750: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
8760: 5f 53 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64  _STAT_HIT   0.#d
8770: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
8780: 5f 4d 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65  _MISS  1.#define
8790: 20 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54   PAGER_STAT_WRIT
87a0: 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  E 2../*.** The f
87b0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
87c0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
87d0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
87e0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
87f0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
8800: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
8810: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
8820: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
8830: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
8840: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
8850: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
8860: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
8870: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
8880: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
8890: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
88a0: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
88b0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
88c0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
88d0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
88e0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
88f0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
8900: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
8910: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
8920: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
8930: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
8940: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
8950: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
8960: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8970: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
8980: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
8990: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
89a0: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
89b0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
89c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
89d0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
89e0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
89f0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
8a00: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
8a10: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
8a20: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
8a30: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
8a40: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
8a50: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
8a60: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
8a70: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
8a80: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
8a90: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
8aa0: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
8ab0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
8ac0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
8ad0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
8ae0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
8af0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
8b00: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
8b10: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
8b20: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
8b30: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
8b40: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
8b50: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
8b60: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
8b70: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
8b80: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
8b90: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
8ba0: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
8bb0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
8bc0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
8bd0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
8be0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
8bf0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
8c00: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
8c10: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
8c20: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
8c30: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
8c40: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
8c50: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
8c60: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
8c70: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
8c80: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
8c90: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
8ca0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
8cb0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
8cc0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
8cd0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
8ce0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
8cf0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
8d00: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
8d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
8d20: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
8d30: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
8d40: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
8d50: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
8d60: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
8d70: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
8d80: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
8d90: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
8da0: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
8db0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
8dc0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
8dd0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
8de0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
8e00: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
8e10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
8e20: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
8e30: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
8e40: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
8e50: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
8e60: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
8e70: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
8e80: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
8e90: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
8ea0: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
8eb0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
8ec0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8ed0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
8ee0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
8ef0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
8f00: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
8f10: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
8f20: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
8f30: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
8f40: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
8f50: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
8f60: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
8f70: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
8f80: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
8f90: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
8fa0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
8fb0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
8fc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
8fd0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
8fe0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
8ff0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
9000: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
9010: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
9020: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
9030: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
9040: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
9050: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
9060: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
9070: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
9080: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
9090: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
90a0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
90b0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
90c0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
90d0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
90e0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
90f0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
9100: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
9110: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
9120: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
9130: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
9140: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
9150: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
9160: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
9170: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
9180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
9190: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
91a0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
91b0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
91c0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
91d0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
91e0: 55 53 45 46 45 54 43 48 20 69 73 20 74 72 75 65  USEFETCH is true
91f0: 20 69 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77   if we are allow
9200: 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 78 46  ed to use the xF
9210: 65 74 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63  etch and xUnfetc
9220: 68 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20  h.** interfaces 
9230: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
9240: 74 61 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d  tabase using mem
9250: 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a  ory-mapped I/O..
9260: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
9270: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20  X_MMAP_SIZE>0.# 
9280: 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48 28  define USEFETCH(
9290: 78 29 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74  x) ((x)->bUseFet
92a0: 63 68 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ch).#else.# defi
92b0: 6e 65 20 55 53 45 46 45 54 43 48 28 78 29 20 30  ne USEFETCH(x) 0
92c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
92d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
92e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
92f0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
9300: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
9310: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
9320: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
9330: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63  ment to this mac
9340: 72 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73  ro is a file des
9350: 63 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71  criptor (type sq
9360: 6c 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a  lite3_file*)..**
9370: 20 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20   Return 0 if it 
9380: 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
9390: 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f  non-zero (but no
93a0: 74 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a  t 1) if it is..*
93b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20  *.** This is so 
93c0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73  that expressions
93d0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
93e0: 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20  as:.**.**   if( 
93f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
9400: 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  fd) ){ ....**.**
9410: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a   instead of.**.*
9420: 2a 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  *   if( pPager->
9430: 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  jfd->pMethods ){
9440: 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   ....*/.#define 
9450: 69 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46  isOpen(pFd) ((pF
9460: 64 29 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29  d)->pMethods!=0)
9470: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9480: 72 75 65 20 69 66 20 74 68 69 73 20 70 61 67 65  rue if this page
9490: 72 20 75 73 65 73 20 61 20 77 72 69 74 65 2d 61  r uses a write-a
94a0: 68 65 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64  head log instead
94b0: 20 6f 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a   of the usual.**
94c0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
94d0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  l. Otherwise fal
94e0: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  se..*/.#ifndef S
94f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73  QLITE_OMIT_WAL.s
9500: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
9510: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
9520: 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ger){.  return (
9530: 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29  pPager->pWal!=0)
9540: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
9550: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9560: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9570: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9580: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9590: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
95a0: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
95b0: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
95c0: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
95d0: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
95e0: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
95f0: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
9600: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
9610: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
9620: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
9630: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
9640: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
9650: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9660: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9670: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9680: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9690: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
96a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
96b0: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
96c0: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
96d0: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
96e0: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
96f0: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
9700: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
9710: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
9720: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
9730: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9740: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
9750: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9760: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9770: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9780: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9790: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
97a0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
97b0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
97c0: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
97d0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
97e0: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
97f0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9800: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
9810: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9820: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
9830: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
9840: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
9850: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9860: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9870: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9880: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9890: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
98a0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
98b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
98c0: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
98d0: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
98e0: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
98f0: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
9900: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
9910: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
9920: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9930: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9940: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9950: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9960: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9970: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9980: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9990: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
99a0: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
99b0: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
99c0: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
99d0: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
99e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
99f0: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
9a00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9a10: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
9a20: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9a30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9a40: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9a50: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9a60: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9a70: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9a80: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9a90: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9aa0: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9ab0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9ac0: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
9ad0: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
9ae0: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
9af0: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
9b00: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
9b10: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
9b20: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9b30: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9b40: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9b50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9b60: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9b70: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9b80: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9b90: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9ba0: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9bb0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9bc0: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
9bd0: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
9be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9bf0: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
9c00: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9c10: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
9c20: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9c30: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9c40: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9c50: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9c60: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9c70: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9c80: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9ca0: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9cb0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9cc0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9cd0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9ce0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9cf0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9d00: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
9d10: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
9d20: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
9d30: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
9d40: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
9d50: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
9d60: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
9d70: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
9d80: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
9d90: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
9da0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
9db0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
9dc0: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
9dd0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
9de0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9df0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
9e00: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
9e10: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
9e20: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
9e30: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
9e40: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
9e50: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
9e60: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
9e70: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
9e80: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
9e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9ea0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9eb0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9ec0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9ed0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
9ee0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
9ef0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
9f00: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
9f10: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9f20: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
9f30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
9f40: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
9f50: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
9f60: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9f70: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
9f80: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9f90: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
9fa0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
9fb0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
9fc0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
9fd0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
9fe0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
9ff0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a000: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a010: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a020: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a030: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a040: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a050: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a060: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a070: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a080: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a090: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a0a0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a0b0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a0c0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a0d0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a0e0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a0f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a100: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a110: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a120: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a130: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a140: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a150: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a160: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a170: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a180: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a190: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a1a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1b0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a1c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a1d0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a1e0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a1f0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a200: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a210: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a220: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a230: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a240: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a250: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a260: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a270: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a280: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a290: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a2a0: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a2b0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a2c0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a2d0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a2e0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a2f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a300: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a310: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a320: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a330: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a340: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a350: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a360: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a380: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a390: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a3a0: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a3b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a3c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a3d0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a3e0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a3f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a400: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a410: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a420: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a430: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a440: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a450: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a460: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a470: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a480: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a490: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a4a0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a4b0: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a4c0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a4d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4e0: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a4f0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a500: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a510: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a520: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a530: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a540: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a550: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a560: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a570: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a580: 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  L .      );.    
a590: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a5a0: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
a5b0: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
a5c0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a5d0: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a5e0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
a5f0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a600: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
a610: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
a620: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a630: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a640: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a650: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
a660: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
a670: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
a680: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
a690: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a6a0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a6b0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
a6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a6d0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a6e0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a6f0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
a700: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a710: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
a720: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
a730: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
a740: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
a750: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
a760: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
a770: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
a780: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
a790: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
a7a0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
a7b0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
a7c0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
a7d0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a7e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a7f0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
a800: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
a810: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
a820: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
a830: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
a840: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a850: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a860: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a870: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a880: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a890: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a8a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a8b0: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a8c0: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a8d0: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a8e0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a8f0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a900: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a910: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a920: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a930: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a940: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a950: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a960: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a970: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
a980: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
a990: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
a9a0: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
a9b0: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
a9c0: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
a9d0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
a9e0: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
a9f0: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
aa00: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
aa10: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
aa20: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
aa30: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
aa40: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
aa50: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
aa60: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aa70: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
aa80: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
aa90: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
aaa0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
aab0: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
aac0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
aad0: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
aae0: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
aaf0: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ab00: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ab10: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
ab20: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
ab30: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
ab40: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
ab50: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
ab60: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
ab70: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
ab80: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
ab90: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
aba0: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
abb0: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
abc0: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
abd0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
abe0: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
abf0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ac00: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ac10: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
ac20: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
ac30: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
ac40: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
ac50: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ac60: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
ac70: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
ac80: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ac90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
aca0: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
acb0: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
acc0: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
acd0: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ace0: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
acf0: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ad00: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ad10: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ad20: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
ad30: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
ad40: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
ad50: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ad60: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
ad70: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ad80: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ad90: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ada0: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
adb0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
adc0: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
add0: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
ade0: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
adf0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
ae00: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
ae10: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
ae20: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
ae30: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
ae40: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
ae50: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
ae60: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
ae70: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
ae80: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
ae90: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aea0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
aeb0: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
aec0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
aed0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aee0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
aef0: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
af00: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af10: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
af20: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
af30: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
af40: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af50: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
af60: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
af70: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
af80: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
af90: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
afa0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
afb0: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
afc0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
afd0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
afe0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
aff0: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b000: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b010: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b020: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b030: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b040: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b050: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b060: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b070: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b080: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b090: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b0a0: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b0b0: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b0c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b0d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b0e0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b0f0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b100: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b110: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b120: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b130: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b140: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b150: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b160: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b170: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b180: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b190: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b1a0: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b1b0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b1c0: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b1d0: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b1e0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b1f0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b200: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b210: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b220: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b230: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b240: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b250: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b260: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b270: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b280: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b290: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b2a0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b2b0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b2c0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b2d0: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b2e0: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b2f0: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b300: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b310: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b320: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b330: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b340: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b350: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b360: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b370: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b380: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b390: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b3a0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b3b0: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b3c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b3d0: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b3e0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b3f0: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b400: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b410: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b420: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b430: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b450: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b460: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b470: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b480: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b490: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b4a0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b4b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b4c0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b4d0: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b4e0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b4f0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b500: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b510: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b520: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b530: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b540: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b550: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b560: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b570: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b580: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b590: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b5a0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b5b0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b5c0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b5d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b5e0: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b5f0: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b600: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b610: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b620: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b630: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b640: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b650: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b660: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b670: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b680: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b690: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b6a0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b6b0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b6c0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b6d0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b6e0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b6f0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b700: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b710: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b720: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b730: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b740: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b750: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b760: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b770: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b780: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b790: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b7a0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b7b0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b7c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b7d0: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b7e0: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b7f0: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b800: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b810: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b820: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b830: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b840: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b850: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b860: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b870: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b880: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b890: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b8a0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b8b0: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b8c0: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b8d0: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
b8e0: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b8f0: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
b900: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
b910: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
b920: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b930: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
b940: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
b950: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
b960: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
b970: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
b980: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
b990: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
b9a0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
b9b0: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
b9c0: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
b9d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
b9e0: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
b9f0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ba00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba10: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
ba20: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
ba30: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
ba40: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
ba50: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
ba60: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
ba70: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
ba80: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
ba90: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
baa0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bab0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bac0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bad0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bae0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
baf0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb00: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb10: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bb20: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bb30: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bb40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bb60: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bb70: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bb80: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bb90: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bba0: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bbb0: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bbc0: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bbd0: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bbe0: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bbf0: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bc00: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bc10: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bc20: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bc30: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bc40: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bc50: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bc60: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bc70: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bc80: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bc90: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bca0: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bcb0: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bcc0: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bcd0: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bce0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
bcf0: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
bd00: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
bd10: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bd20: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
bd30: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
bd40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bd50: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
bd60: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bd70: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
bd80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
bd90: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
bda0: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
bdb0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
bdc0: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
bdd0: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
bde0: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
bdf0: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
be00: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
be10: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
be20: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
be30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
be40: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
be50: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
be60: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
be70: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
be80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
be90: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bea0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
beb0: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bec0: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bed0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bee0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
bef0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
bf00: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
bf10: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
bf20: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
bf30: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
bf40: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
bf50: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
bf60: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
bf70: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
bf80: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
bf90: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
bfa0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
bfb0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
bfc0: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
bfd0: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
bfe0: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
bff0: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c000: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c010: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c020: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c030: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c040: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c050: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c060: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c070: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c080: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c090: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c0a0: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c0b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c0c0: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c0d0: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c0e0: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c0f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c100: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c110: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c120: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c130: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c140: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c150: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c160: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c170: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c180: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c190: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c1a0: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c1b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c1c0: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c1d0: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c1e0: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c1f0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c200: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c210: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c220: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c230: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c260: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c270: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c2a0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c2b0: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2d0: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c2e0: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c2f0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c300: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c310: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c320: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c330: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c340: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c350: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c360: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c370: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c380: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c390: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c3a0: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c3b0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c3c0: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c3d0: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c3e0: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c3f0: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c400: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c410: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c420: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c430: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c440: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c450: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c460: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c470: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c480: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
c490: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
c4a0: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
c4b0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
c4c0: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
c4d0: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
c4e0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
c4f0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
c500: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
c510: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
c520: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
c530: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
c540: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
c550: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
c560: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
c570: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
c580: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
c590: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
c5a0: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
c5b0: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
c5c0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
c5d0: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
c5e0: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
c5f0: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
c600: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
c610: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
c620: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
c630: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
c640: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
c650: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
c660: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
c670: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
c680: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
c690: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
c6a0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c6b0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
c6c0: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
c6d0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
c6e0: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
c6f0: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
c700: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
c710: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
c720: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
c730: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
c740: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
c750: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
c760: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
c770: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
c780: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
c790: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
c7a0: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
c7b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
c7c0: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
c7d0: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
c7e0: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
c7f0: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
c800: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
c810: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
c820: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
c830: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
c840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
c850: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
c860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
c870: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
c880: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
c890: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
c8a0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
c8b0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
c8c0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c8d0: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
c8e0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
c8f0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
c900: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
c910: 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  X).#define CHECK
c920: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
c930: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
c940: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
c950: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
c960: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
c970: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
c980: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
c990: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
c9a0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
c9b0: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
c9c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
c9d0: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
c9e0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
c9f0: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
ca00: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
ca10: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
ca20: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
ca30: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
ca40: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
ca50: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
ca60: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
ca70: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
ca80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ca90: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
caa0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
cab0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
cac0: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
cad0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
cae0: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
caf0: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
cb00: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
cb10: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
cb20: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
cb30: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
cb40: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
cb50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
cb60: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
cb70: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
cb80: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
cb90: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
cba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
cbb0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
cbc0: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
cbd0: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
cbe0: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
cbf0: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
cc00: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
cc10: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
cc20: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
cc30: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
cc40: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
cc50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cc60: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
cc70: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
cc80: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
cc90: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
cca0: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
ccb0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
ccc0: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
ccd0: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
cce0: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
ccf0: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
cd00: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
cd10: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
cd20: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
cd30: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
cd40: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
cd50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cd60: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
cd70: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
cd80: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
cd90: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
cda0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
cdb0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
cdc0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
cdd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
cde0: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
cdf0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
ce00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ce10: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ce20: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
ce30: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
ce40: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
ce50: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
ce80: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
ce90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cea0: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
ceb0: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
cec0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
ced0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
cef0: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
cf00: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
cf10: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
cf20: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
cf30: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
cf40: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
cf50: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
cf60: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cf80: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
cf90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
cfa0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
cfb0: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
cfc0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
cfd0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
cfe0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
cff0: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
d000: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d010: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
d020: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
d030: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
d040: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d050: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d060: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
d070: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
d080: 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d  ter .   || len==
d090: 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  0 .   || SQLITE_
d0a0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
d0b0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
d0c0: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
d0d0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d0e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d0f0: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
d100: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
d110: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
d120: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
d130: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
d140: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
d150: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
d160: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
d170: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
d180: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
d190: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
d1a0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
d1b0: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
d1c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
d1d0: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
d1e0: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
d1f0: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
d200: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
d210: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
d220: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
d230: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
d240: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
d250: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
d260: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
d270: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d280: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
d290: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
d2a0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
d2b0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
d2c0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
d2d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
d2e0: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
d2f0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
d300: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
d310: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
d320: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
d330: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
d340: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
d350: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
d360: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
d370: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
d380: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
d390: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
d3a0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
d3b0: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
d3c0: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
d3d0: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
d3e0: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
d3f0: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
d400: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
d410: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
d420: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
d430: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
d440: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
d450: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
d4f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
d500: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
d510: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
d520: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
d530: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d540: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
d550: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
d560: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
d570: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
d580: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
d590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d5a0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
d5b0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d5c0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
d5d0: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
d5e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
d5f0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d600: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
d610: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
d620: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
d630: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
d640: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
d650: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
d660: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
d670: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
d680: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d690: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
d6a0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
d6b0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
d6c0: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
d6d0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
d6e0: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
d6f0: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
d700: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
d710: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
d720: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
d730: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
d740: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
d750: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
d760: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
d770: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
d780: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
d790: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
d7a0: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
d7b0: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
d7c0: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
d7d0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
d7e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d7f0: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
d800: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
d810: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
d820: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
d830: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d840: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
d850: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
d860: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
d870: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
d880: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
d890: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
d8a0: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
d8b0: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
d8c0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
d8d0: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
d8e0: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
d8f0: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
d900: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
d910: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
d920: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
d930: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
d940: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
d950: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
d960: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
d970: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
d980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
d990: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
d9a0: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
d9b0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
d9c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
d9d0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
d9e0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
d9f0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
da00: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
da10: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
da20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
da30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
da40: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
da50: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
da60: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
da70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
da80: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
dab0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
dac0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
dad0: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
dae0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
daf0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
db00: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
db10: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
db20: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
db30: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
db40: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
db50: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
db60: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
db70: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
db80: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
db90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
dba0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
dbb0: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
dbc0: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
dbd0: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
dbe0: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
dbf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dc00: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
dc10: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
dc20: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
dc30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
dc40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
dc50: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
dc60: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
dc70: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
dc80: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
dc90: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
dca0: 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
dcb0: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
dcc0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
dcd0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
dce0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
dcf0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
dd00: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
dd10: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
dd20: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
dd30: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
dd40: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
dd50: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
dd60: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
dd70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
dd80: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
dd90: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
dda0: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
ddb0: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
ddc0: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
ddd0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
dde0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
ddf0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
de00: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
de10: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
de20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
de30: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
de40: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
de50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
de60: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
de70: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
de80: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
de90: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
dea0: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
deb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
dec0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
ded0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
dee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
def0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
df00: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
df10: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
df20: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
df30: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
df40: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
df50: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
df60: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
df70: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
df80: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
df90: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
dfa0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
dfb0: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
dfc0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
dfd0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
dfe0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
dff0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
e000: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
e010: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
e020: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
e030: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
e040: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
e050: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
e060: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
e070: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
e080: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
e090: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
e0a0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
e0b0: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
e0c0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
e0d0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
e0e0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
e0f0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
e100: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
e110: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
e120: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
e130: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
e140: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
e150: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
e160: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
e170: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
e180: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
e190: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
e1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e1b0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
e1c0: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
e1d0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
e1e0: 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  ;  /* Temporary 
e1f0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75  space used to bu
e200: 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ild header */.  
e210: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75  u32 nHeader = (u
e220: 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
e230: 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62  ize;/* Size of b
e240: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
e250: 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20   by zHeader */. 
e260: 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20   u32 nWrite;    
e270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e280: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
e290: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77   header sector w
e2a0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
e2b0: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e2e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
e2f0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
e300: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
e310: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
e320: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66  e open. */..  if
e330: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
e340: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
e350: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
e360: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
e370: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
e380: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
e390: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
e3a0: 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68  ts and any of th
e3b0: 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20  em were created 
e3c0: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
e3d0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
e3e0: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
e3f0: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
e400: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61  he .  ** PagerSa
e410: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
e420: 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  et fields now.. 
e430: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
e440: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
e450: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
e460: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
e470: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
e480: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
e490: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
e4a0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
e4b0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
e4c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
e4d0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
e4e0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
e4f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
e500: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
e510: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
e520: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
e530: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
e540: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
e550: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
e560: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
e570: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
e580: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
e590: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
e5a0: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
e5b0: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
e5c0: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
e5d0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
e5e0: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
e5f0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
e600: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
e610: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
e620: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
e630: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
e640: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
e650: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
e660: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
e670: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
e680: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
e690: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
e6a0: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
e6b0: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
e6c0: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
e6d0: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
e6e0: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
e6f0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
e700: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
e710: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
e720: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
e730: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
e740: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
e750: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
e760: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
e770: 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77  ccurred whilst w
e780: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
e790: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
e7a0: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
e7b0: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
e7c0: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
e7d0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
e7e0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
e7f0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
e800: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
e810: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
e820: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
e830: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
e840: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
e850: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
e860: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
e870: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
e880: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
e890: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
e8a0: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
e8b0: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
e8c0: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
e8d0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
e8e0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
e8f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e900: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
e910: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
e920: 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
e930: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20  noSync );.  if( 
e940: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
e950: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
e960: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
e970: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
e980: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
e990: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
e9a0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
e9b0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
e9c0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
e9d0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
e9e0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
e9f0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
ea00: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
ea10: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
ea20: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ea30: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
ea40: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
ea50: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  se{.    memset(z
ea60: 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Header, 0, sizeo
ea70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ea80: 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  +4);.  }..  /* T
ea90: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
eaa0: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72  hash initializer
eab0: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
eac0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
ead0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
eae0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
eaf0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
eb00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
eb10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
eb20: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
eb30: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
eb40: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
eb50: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
eb60: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb70: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb80: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
eb90: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
eba0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
ebb0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
ebc0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
ebd0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
ebe0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ebf0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
ec00: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
ec10: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
ec20: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
ec30: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
ec40: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
ec50: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
ec60: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ec70: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
ec80: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
ec90: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
eca0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
ecb0: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
ecc0: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
ecd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
ece0: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
ecf0: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
ed00: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
ed10: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
ed20: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
ed30: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
ed40: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
ed50: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
ed60: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
ed70: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
ed80: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
ed90: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
eda0: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
edb0: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
edc0: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
edd0: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
ede0: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
edf0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
ee00: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
ee10: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
ee20: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
ee30: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
ee40: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
ee50: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
ee60: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
ee70: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
ee80: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
ee90: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
eea0: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
eeb0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
eec0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
eed0: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
eee0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
eef0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
ef00: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
ef10: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
ef20: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
ef30: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
ef40: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
ef50: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
ef60: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
ef70: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
ef80: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
ef90: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
efa0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
efb0: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
efc0: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
efd0: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
efe0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
eff0: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
f000: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
f010: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
f020: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
f030: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
f040: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
f050: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
f060: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
f070: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
f080: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
f090: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
f0a0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
f0b0: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
f0c0: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
f0d0: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
f0e0: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
f0f0: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
f100: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
f110: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
f120: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
f130: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
f140: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
f150: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
f160: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
f170: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
f180: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
f190: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
f1a0: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
f1b0: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
f1c0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
f1d0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
f1e0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
f1f0: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
f200: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
f210: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
f220: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
f230: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
f240: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
f250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f260: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
f270: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
f280: 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
f290: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f2a0: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
f2b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f2c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
f2d0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
f2e0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
f2f0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
f300: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
f310: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f320: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
f330: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
f340: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
f350: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
f360: 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  le. The current 
f370: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
f380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
f390: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67  given by.** pPag
f3a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20  er->journalOff. 
f3b0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
f3c0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
f3d0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
f3e0: 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69  r.** a descripti
f3f0: 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
f400: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
f410: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
f420: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
f430: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65  cessfully, *pNRe
f440: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
f450: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
f460: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
f470: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
f480: 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20  and *pDbSize is 
f490: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
f4a0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
f4b0: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
f4c0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
f4d0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
f4e0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
f4f0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
f500: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
f510: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
f520: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
f530: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
f540: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
f550: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
f560: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
f570: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
f580: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
f590: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
f5a0: 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61  ned and *pNRec a
f5b0: 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20  nd *PDbSize are 
f5c0: 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a  undefined.  If J
f5d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f5e0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
f5f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f600: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
f610: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
f620: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
f630: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
f640: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
f650: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
f660: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
f670: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48  ect */.  int isH
f680: 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  ot,.  i64 journa
f690: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
f6a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
f6b0: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
f6c0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
f6d0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f6f0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
f700: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
f710: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
f720: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
f730: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
f740: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
f750: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
f760: 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
f770: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
f780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f790: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
f7a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
f7b0: 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
f7c0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
f7d0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
f7e0: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
f7f0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
f800: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
f810: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
f820: 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
f830: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
f840: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
f850: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
f860: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
f870: 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
f880: 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
f890: 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
f8a0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
f8b0: 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
f8c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
f8d0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
f8e0: 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
f8f0: 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
f900: 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
f910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
f920: 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
f930: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
f940: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
f950: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
f960: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f970: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
f980: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
f990: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
f9a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
f9b0: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
f9c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
f9d0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
f9e0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
f9f0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
fa00: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
fa10: 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
fa20: 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
fa30: 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
fa40: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
fa50: 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
fa60: 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
fa70: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
fa80: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
fa90: 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
faa0: 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
fab0: 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
fac0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
fad0: 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d  Hot || iHdrOff!=
fae0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
faf0: 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  dr ){.    rc = s
fb00: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
fb10: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
fb20: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
fb30: 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20  , iHdrOff);.    
fb40: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
fb50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
fb60: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
fb70: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
fb80: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fb90: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
fba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbb0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
fbc0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
fbd0: 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
fbe0: 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
fbf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
fc00: 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
fc10: 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
fc20: 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
fc30: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
fc40: 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
fc50: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
fc60: 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
fc70: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
fc80: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
fc90: 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
fca0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
fcb0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
fcc0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
fcd0: 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
fce0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
fcf0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
fd00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
fd10: 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
fd20: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
fd30: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
fd40: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
fd50: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
fd60: 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
fd70: 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
fd80: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
fd90: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
fda0: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
fdb0: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdd0: 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
fde0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fdf0: 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
fe00: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
fe10: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
fe20: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
fe30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
fe40: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
fe50: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
fe60: 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
fe70: 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
fe80: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
fe90: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
fea0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
feb0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
fec0: 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
fed0: 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
fee0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
fef0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
ff00: 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
ff10: 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
ff20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
ff30: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
ff40: 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   Versions of SQL
ff50: 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35  ite prior to 3.5
ff60: 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d  .8 set the page-
ff70: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
ff80: 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
ff90: 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e   header to zero.
ffa0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
ffb0: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50  ssume that the P
ffc0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
ffd0: 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
ffe0: 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
fff0: 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
10000 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
10010 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d    if( iPageSize=
10020 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67  =0 ){.      iPag
10030 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
10040 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10050 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
10060 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
10070 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
10080 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10090 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20  -size fields.   
100a0 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72   ** are within r
100b0 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20  ange. To be 'in 
100c0 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c  range', both val
100d0 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61  ues need to be a
100e0 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66   power.    ** of
100f0 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
10100 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31  n or equal to 51
10110 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74  2 or 32, and not
10120 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
10130 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70  eir .    ** resp
10140 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74  ective compile t
10150 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69  ime maximum limi
10160 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
10170 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32  f( iPageSize<512
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10190 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65    || iSectorSize
101a0 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  <32.     || iPag
101b0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
101c0 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
101d0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
101e0 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
101f0 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
10200 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
10210 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
10220 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
10230 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
10240 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
10250 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
10260 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
10270 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
10280 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
10290 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
102a0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
102b0 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
102c0 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
102d0 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
102e0 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
102f0 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
10300 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
10310 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
10320 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
10330 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
10340 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10360 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
10370 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
10380 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
10390 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
103a0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
103b0 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
103c0 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
103d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
103e0 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
103f0 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
10400 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10410 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
10420 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10430 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10440 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
10450 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20  PageSize, -1);. 
10460 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
10480 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10490 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
104a0 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
104b0 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
104c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  .    ** the proc
104d0 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
104e0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
104f0 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
10500 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  as.    ** create
10510 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
10520 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
10530 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
10540 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20  utine.    ** is 
10550 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
10560 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
10570 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
10580 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a  ocal value.    *
10590 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
105a0 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
105b0 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
105c0 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
105d0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
105e0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53  >sectorSize = iS
105f0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a  ectorSize;.  }..
10600 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10610 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
10620 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
10630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10640 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
10650 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
10660 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10670 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
10680 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
10690 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
106a0 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
106b0 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
106c0 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
106d0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
106e0 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
106f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10700 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10710 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10720 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
10730 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10740 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
10750 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
10760 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
10770 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
10780 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
10790 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  t is:.**.**   + 
107a0 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
107b0 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e  J_PGNO..**   + N
107c0 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
107d0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
107e0 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b  in utf-8..**   +
107f0 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e   4 bytes: N (len
10800 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
10810 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79  urnal name in by
10820 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d  tes, no nul-term
10830 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20  inator)..**   + 
10840 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
10850 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
10860 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20  cksum..**   + 8 
10870 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
10880 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
10890 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
108a0 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
108b0 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
108c0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
108d0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
108e0 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68  name, where each
108f0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
10900 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64  eted as a signed
10910 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a   8-bit integer..
10920 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
10930 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
10940 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
10950 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
10960 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
10970 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
10980 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
10990 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
109a0 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
109b0 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
109c0 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
109d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
10a00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
10a10 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
10a20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
10a30 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
10a40 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
10a50 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
10a60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
10a70 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20  et of header in 
10a80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
10a90 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20    i64 jrnlSize; 
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
10ac0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69  urnal file on di
10ad0 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  sk */.  u32 cksu
10ae0 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
10af0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
10b00 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a  ksum of string z
10b10 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  Master */..  ass
10b20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
10b30 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61  Master==0 );.  a
10b40 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
10b50 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
10b60 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a    if( !zMaster .
10b70 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
10b80 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
10b90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
10ba0 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70  ORY .   || !isOp
10bb0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a  en(pPager->jfd).
10bc0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
10bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10be0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
10bf0 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
10c00 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10c10 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
10c20 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
10c30 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
10c40 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
10c50 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
10c60 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
10c70 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
10c80 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
10c90 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
10ca0 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
10cb0 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
10cc0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
10cd0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
10ce0 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
10cf0 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
10d00 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
10d10 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
10d20 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
10d30 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
10d40 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
10d50 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
10d60 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
10d70 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
10d80 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
10d90 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
10da0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
10db0 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
10dc0 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
10dd0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
10de0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
10df0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
10e00 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
10e10 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
10e20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
10e30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
10e40 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
10e50 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
10e60 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
10e70 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
10e80 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
10e90 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
10ea0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10eb0 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
10ec0 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
10ed0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
10ee0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
10ef0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
10f00 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
10f10 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
10f20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
10f30 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
10f40 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
10f50 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
10f60 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10f70 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
10f80 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10f90 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
10fa0 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
10fb0 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
10fc0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
10fd0 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
10fe0 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20  alMagic, 8,.    
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64               iHd
11010 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
11020 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
11030 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
11040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11050 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
11060 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
11070 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
11080 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
11090 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
110a0 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
110b0 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
110c0 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
110d0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
110e0 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
110f0 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
11100 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
11110 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
11120 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
11130 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
11140 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
11150 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
11160 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
11170 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
11180 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
11190 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
111a0 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
111b0 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
111c0 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
111d0 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
111e0 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
111f0 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
11200 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
11210 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
11220 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
11230 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
11240 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
11250 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11260 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11270 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11280 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
11290 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
112a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
112b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
112c0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
112d0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
112e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
112f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11310 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
11320 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
11330 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
11340 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11350 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11360 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11370 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11380 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  sion++;.  sqlite
11390 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
113a0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
113b0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
113c0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
113d0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
113e0 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67   Return the pPag
113f0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
11400 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71   value.*/.u32 sq
11410 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65  lite3PagerDataVe
11420 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  rsion(Pager *pPa
11430 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
11440 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
11450 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72  AGER_OPEN );.  r
11460 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44  eturn pPager->iD
11470 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  ataVersion;.}../
11480 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
11490 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
114a0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
114b0 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
114c0 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
114d0 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
114e0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
114f0 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
11500 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
11510 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
11520 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
11530 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11540 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
11550 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
11560 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
11570 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
11580 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11590 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
115a0 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
115b0 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
115c0 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
115d0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
115e0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
115f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
11600 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11610 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11620 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
11630 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
11640 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11650 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
11660 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
11670 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11680 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11690 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
116a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
116b0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
116c0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
116d0 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
116e0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
116f0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11700 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
11710 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
11720 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
11730 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11740 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11750 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11760 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11770 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11780 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11790 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
117a0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
117b0 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
117c0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
117d0 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
117e0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
117f0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11800 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11820 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11830 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11840 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11850 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11860 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11870 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11880 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11890 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
118a0 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
118b0 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
118c0 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
118d0 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
118e0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
118f0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11900 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11910 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11920 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11930 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11940 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11950 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11980 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11990 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
119a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
119b0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
119c0 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
119d0 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
119e0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
119f0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
11a00 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
11a10 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
11a20 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11a30 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
11a40 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
11a50 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
11a60 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
11a70 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
11a80 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
11a90 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
11aa0 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
11ab0 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
11ac0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
11ad0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
11ae0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
11af0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
11b00 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
11b10 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11b20 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
11b30 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11b40 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
11b50 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
11b60 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
11b70 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
11b80 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
11b90 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
11ba0 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
11bb0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
11bc0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
11bd0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
11be0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
11bf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
11c00 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11c10 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
11c20 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
11c30 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
11c40 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
11c50 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
11c60 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
11c70 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
11c80 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
11c90 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
11ca0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11cb0 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
11cc0 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
11cd0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
11ce0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
11cf0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
11d00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
11d10 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
11d20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
11d30 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
11d40 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
11d50 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
11d60 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
11d70 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
11d80 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
11d90 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
11da0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
11db0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
11dc0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
11dd0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
11de0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
11df0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
11e00 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
11e10 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
11e20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
11e30 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
11e40 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
11e50 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
11e60 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
11e90 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
11ea0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
11eb0 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
11ec0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
11ed0 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
11ee0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
11ef0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
11f00 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
11f10 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
11f20 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
11f30 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
11f40 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
11f50 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
11f60 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
11f70 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
11f80 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
11f90 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
11fa0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
11fb0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
11fc0 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
11fd0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
11fe0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
11ff0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
12000 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12010 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
12020 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12030 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12050 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12060 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12070 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12080 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12090 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
120a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
120b0 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
120c0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
120d0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
120e0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
120f0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
12100 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12110 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
12120 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12130 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12140 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12150 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12160 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12180 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12190 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
121a0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
121b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
121c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
121d0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
121e0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
121f0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12200 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12210 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
12220 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
12230 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12240 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
12250 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
12260 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
12270 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
12280 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12290 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
122a0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
122b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
122c0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
122d0 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
122e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
122f0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
12300 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12310 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
12320 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
12330 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12340 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12350 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
12360 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
12370 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
12380 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12390 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
123a0 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
123b0 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
123c0 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
123d0 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
123e0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
123f0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
12400 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
12410 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12420 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
12430 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12440 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
12450 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
12460 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12470 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
12480 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12490 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
124a0 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
124b0 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
124c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
124d0 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
124e0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
124f0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
12500 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
12510 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12520 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
12530 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12540 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12550 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12560 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12570 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12580 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12590 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
125a0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
125b0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 61  errCode ){.    a
125c0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
125d0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
125e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
125f0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
12600 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
12610 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 70 50  tempFile;.    pP
12620 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12630 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 70  AGER_OPEN;.    p
12640 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
12650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12660 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
12670 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73  ger) ) sqlite3Os
12680 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
12690 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  fd, 0, 0);.  }..
126a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
126b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
126c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
126d0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
126e0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a  tMaster = 0;.}..
126f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12700 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12710 65 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20  enever an IOERR 
12720 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68  or FULL error th
12730 61 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74  at requires.** t
12740 68 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e  he pager to tran
12750 73 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  sition into the 
12760 45 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20  ERROR state may 
12770 61 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a  ahve occurred..*
12780 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
12790 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
127a0 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
127b0 74 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65  tructure, the se
127c0 63 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72  cond .** the err
127d0 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
127e0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
127f0 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
12800 74 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61  tion. The .** va
12810 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
12820 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
12830 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
12840 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
12850 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
12860 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12870 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51   SQLITE_FULL, SQ
12880 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e  LITE_IOERR or on
12890 65 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52  e of the.** IOER
128a0 52 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65  R sub-codes, the
128b0 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
128c0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
128d0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
128e0 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e  .** is stored in
128f0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20   Pager.errCode. 
12900 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12910 72 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45  remains in the E
12920 52 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61  RROR state,.** a
12930 6c 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c  ll major API cal
12940 6c 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20  ls on the Pager 
12950 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
12960 20 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72   return Pager.er
12970 72 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rCode..**.** The
12980 20 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64   ERROR state ind
12990 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
129a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
129b0 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
129c0 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
129d0 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
129e0 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
129f0 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
12a00 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
12a10 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
12a20 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
12a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12a40 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
12a50 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
12a60 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ror occurred, th
12a70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
12a80 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64  journal may need
12a90 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79  .** to be replay
12aa0 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
12ab0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12ac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12ad0 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72  (as if.** it wer
12ae0 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29  e a hot-journal)
12af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12b00 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
12b10 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
12b20 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
12b30 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
12b40 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
12b50 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
12b60 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20    assert(.      
12b70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12b80 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
12b90 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12ba0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
12bb0 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50  OK ||.       (pP
12bc0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20  ager->errCode & 
12bd0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
12be0 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ERR.  );.  if( r
12bf0 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
12c00 7c 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49  || rc2==SQLITE_I
12c10 4f 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67  OERR ){.    pPag
12c20 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
12c30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
12c40 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52  tate = PAGER_ERR
12c50 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12c60 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
12c70 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
12c80 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12c90 20 50 67 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f   Pgno nPage);../
12ca0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
12cb0 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
12cc0 74 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74  tion. A transact
12cd0 69 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65  ion is usually e
12ce0 6e 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68  nded by .** eith
12cf0 65 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  er a COMMIT or a
12d00 20 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74   ROLLBACK operat
12d10 69 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ion. This routin
12d20 65 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  e may be called 
12d30 0a 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  .** after rollba
12d40 63 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  ck of a hot-jour
12d50 6e 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  nal, or if an er
12d60 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
12d70 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20   opening.** the 
12d80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
12d90 77 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79  writing the very
12da0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
12db0 65 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61  eader of a.** da
12dc0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
12dd0 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  on..** .** This 
12de0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
12df0 20 63 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52   called in PAGER
12e00 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66  _ERROR state. If
12e10 20 69 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a   it is called.**
12e20 20 69 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f   in PAGER_NONE o
12e30 72 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73  r PAGER_SHARED s
12e40 74 61 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63  tate and the loc
12e50 6b 20 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a  k held is less.*
12e60 2a 20 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e  * exclusive than
12e70 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
12e80 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
12e90 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
12ea0 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76  , any active sav
12eb0 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65  epoints are rele
12ec0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ased..**.** If t
12ed0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12ee0 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74  is open, then it
12ef0 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e   is "finalized".
12f00 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20   Once a journal 
12f10 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65  .** file has bee
12f20 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69  n finalized it i
12f30 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
12f40 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c  o use it to roll
12f50 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e   back a .** tran
12f60 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c  saction. Nor wil
12f70 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72  l it be consider
12f80 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a  ed to be a hot-j
12f90 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a  ournal by this.*
12fa0 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64  * or any other d
12fb0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12fc0 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20  on. Exactly how 
12fd0 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e  a journal is fin
12fe0 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64  alized.** depend
12ff0 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  s on whether or 
13000 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73  not the pager is
13010 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
13020 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a  usive mode and.*
13030 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f  * the current jo
13040 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65  urnal-mode (Page
13050 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61  r.journalMode va
13060 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  lue), as follows
13070 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  :.**.**   journa
13080 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a  lMode==MEMORY.**
13090 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
130a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
130b0 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54  simply closed. T
130c0 68 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20  his destroys an 
130d0 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  .**     in-memor
130e0 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  y journal..**.**
130f0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13100 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20  TRUNCATE.**     
13110 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  Journal file is 
13120 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
13130 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
13140 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
13150 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a  Mode==PERSIST.**
13160 20 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32       The first 2
13170 38 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a  8 bytes of the j
13180 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20  ournal file are 
13190 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76  zeroed. This inv
131a0 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20  alidates.**     
131b0 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
131c0 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
131d0 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20  file, and hence 
131e0 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
131f0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20  al.**     file. 
13200 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e  An invalid journ
13210 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62  al file cannot b
13220 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
13230 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13240 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20  de==DELETE.**   
13250 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69    The journal fi
13260 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64  le is closed and
13270 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73   deleted using s
13280 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29  qlite3OsDelete()
13290 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74  ..**.**     If t
132a0 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
132b0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
132c0 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68   mode, this meth
132d0 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67  od of finalizing
132e0 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
132f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65  nal file is neve
13300 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c  r used. Instead,
13310 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d   if the journalM
13320 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45  ode is.**     DE
13330 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67  LETE and the pag
13340 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69  er is in exclusi
13350 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74  ve mode, the met
13360 68 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e  hod described un
13370 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  der.**     journ
13380 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20  alMode==PERSIST 
13390 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
133a0 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  .**.** After the
133b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
133c0 6c 69 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72  lized, the pager
133d0 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
133e0 52 45 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a  READER state..**
133f0 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e   If running in n
13400 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c  on-exclusive rol
13410 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20  lback mode, the 
13420 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
13430 20 69 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64   is .** downgrad
13440 65 64 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c  ed to a SHARED_L
13450 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OCK..**.** SQLIT
13460 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13470 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
13480 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
13490 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
134a0 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
134b0 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
134c0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
134d0 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
134e0 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
134f0 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
13500 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
13510 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
13520 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
13530 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
13540 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13550 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
13560 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
13570 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
13580 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
13590 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
135a0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
135b0 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
135c0 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
135d0 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
135e0 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
135f0 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
13600 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
13610 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
13620 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
13630 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
13640 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
13650 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
13660 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
13670 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13680 74 20 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74  t hasMaster, int
13690 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74   bCommit){.  int
136a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
136b0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
136c0 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
136d0 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
136e0 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
136f0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
13700 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
13710 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
13720 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13730 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  n */..  /* Do no
13740 74 68 69 6e 67 20 69 66 20 74 68 65 20 70 61 67  thing if the pag
13750 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
13760 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
13770 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
13780 6f 72 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  or at least a RE
13790 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69  SERVED lock. Thi
137a0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62  s function may b
137b0 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  e called when th
137c0 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77  ere.  ** is no w
137d0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
137e0 20 61 63 74 69 76 65 20 62 75 74 20 61 20 52 45   active but a RE
137f0 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
13800 72 20 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68  r lock is.  ** h
13810 65 6c 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69  eld under two ci
13820 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a  rcumstances:.  *
13830 2a 0a 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65  *.  **   1. Afte
13840 72 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 68  r a successful h
13850 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
13860 61 63 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65  ack, it is calle
13870 64 20 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20  d with.  **     
13880 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e   eState==PAGER_N
13890 4f 4e 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45  ONE and eLock==E
138a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20  XCLUSIVE_LOCK.. 
138b0 20 2a 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66   **.  **   2. If
138c0 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69   a connection wi
138d0 74 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  th locking_mode=
138e0 65 78 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e  exclusive holdin
138f0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  g an EXCLUSIVE .
13900 20 20 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73    **      lock s
13910 77 69 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20  witches back to 
13920 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72  locking_mode=nor
13930 6d 61 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65  mal and then exe
13940 63 75 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20  cutes a.  **    
13950 20 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69    read-transacti
13960 6f 6e 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  on, this functio
13970 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  n is called with
13980 20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52   eState==PAGER_R
13990 45 41 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20  EADER .  **     
139a0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
139b0 55 53 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20  USIVE_LOCK when 
139c0 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
139d0 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a  tion is closed..
139e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
139f0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
13a00 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
13a10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13a20 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
13a30 4f 52 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  OR );.  if( pPag
13a40 65 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52  er->eState<PAGER
13a50 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26  _WRITER_LOCKED &
13a60 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  & pPager->eLock<
13a70 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13a80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13a90 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65  TE_OK;.  }..  re
13aa0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
13ab0 74 73 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  ts(pPager);.  as
13ac0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
13ad0 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
13ae0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
13af0 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70  =0 );.  if( isOp
13b00 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13b10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
13b20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13b30 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  er) );..    /* F
13b40 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13b50 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
13b60 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
13b70 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
13b80 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61  >jfd) ){.      a
13b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13ba0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
13bb0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
13bc0 4d 4f 52 59 20 29 3b 0a 20 20 20 20 20 20 73 71  MORY );.      sq
13bd0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13be0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
13bf0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
13c00 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
13c10 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
13c20 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
13c30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
13c40 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
13c50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13c60 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
13c70 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
13c80 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
13c90 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
13ca0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
13cb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13cc0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
13cd0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
13ce0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
13cf0 6e 65 77 20 66 69 6c 65 20 73 69 7a 65 20 69 73  new file size is
13d00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
13d10 65 20 69 6e 6f 64 65 20 72 69 67 68 74 20 61 77  e inode right aw
13d20 61 79 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ay..          **
13d30 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 6a   Otherwise the j
13d40 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 72 65 73  ournal might res
13d50 75 72 72 65 63 74 20 66 6f 6c 6c 6f 77 69 6e 67  urrect following
13d60 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 61 6e   a power loss an
13d70 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
13d80 61 75 73 65 20 74 68 65 20 6c 61 73 74 20 74 72  ause the last tr
13d90 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 72 6f 6c  ansaction to rol
13da0 6c 20 62 61 63 6b 2e 20 20 53 65 65 0a 20 20 20  l back.  See.   
13db0 20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 73 3a         ** https:
13dc0 2f 2f 62 75 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c  //bugzilla.mozil
13dd0 6c 61 2e 6f 72 67 2f 73 68 6f 77 5f 62 75 67 2e  la.org/show_bug.
13de0 63 67 69 3f 69 64 3d 31 30 37 32 37 37 33 0a 20  cgi?id=1072773. 
13df0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
13e00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13e10 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
13e20 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
13e30 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
13e40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13e50 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13e60 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lOff = 0;.    }e
13e70 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
13e80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
13e90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
13ea0 45 52 53 49 53 54 0a 20 20 20 20 20 20 7c 7c 20  ERSIST.      || 
13eb0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
13ec0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
13ed0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
13ee0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
13ef0 5f 57 41 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20  _WAL).    ){.   
13f00 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
13f10 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
13f20 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
13f30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13f40 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Off = 0;.    }el
13f50 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  se{.      /* Thi
13f60 73 20 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20  s branch may be 
13f70 65 78 65 63 75 74 65 64 20 77 69 74 68 20 50 61  executed with Pa
13f80 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  ger.journalMode=
13f90 3d 4d 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20  =MEMORY if.     
13fa0 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
13fb0 6c 20 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65  l was just rolle
13fc0 64 20 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  d back. In this 
13fd0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
13fe0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73  .      ** file s
13ff0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
14000 61 6e 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20  and deleted. If 
14010 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
14020 77 72 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20  writes to.      
14030 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14040 66 69 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f  file, it will do
14050 20 73 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d   so using an in-
14060 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
14070 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14080 69 6e 74 20 62 44 65 6c 65 74 65 20 3d 20 28 21  int bDelete = (!
14090 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
140a0 20 26 26 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   && sqlite3Journ
140b0 61 6c 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  alExists(pPager-
140c0 3e 6a 66 64 29 29 3b 0a 20 20 20 20 20 20 61 73  >jfd));.      as
140d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
140e0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
140f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
14100 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
14110 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14120 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14130 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14140 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14150 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14160 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14170 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
14180 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14190 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
141a0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
141b0 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
141c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
141d0 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
141e0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
141f0 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
14200 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14210 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
14220 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
14230 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
14240 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
14250 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
14260 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
14270 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
14280 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
14290 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
142a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
142b0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
142c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
142d0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
142e0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
142f0 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
14300 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
14310 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
14320 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
14330 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
14340 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
14350 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
14360 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
14370 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
14380 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
14390 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
143a0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
143b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
143c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
143d0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
143e0 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
143f0 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  dbSize);..  if( 
14400 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
14410 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
14420 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
14430 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
14440 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
14450 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
14460 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
14470 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
14480 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
14490 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
144a0 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
144b0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
144c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
144d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
144e0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
144f0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
14500 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
14510 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
14520 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c  LITE_OK );.  }el
14530 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
14540 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14550 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  && pPager->dbFil
14560 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  eSize>pPager->db
14570 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Size ){.    /* T
14580 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14590 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ken when committ
145a0 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
145b0 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  n in rollback-jo
145c0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64  urnal.    ** mod
145d0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
145e0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
145f0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
14600 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
14610 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  ..    ** At this
14620 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e   point the journ
14630 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  al has been fina
14640 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72  lized and the tr
14650 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14660 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  * successfully c
14670 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68  ommitted, but th
14680 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
14690 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
146a0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c  n the.    ** fil
146b0 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65  e. So it is safe
146c0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
146d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
146e0 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20  o its minimum.  
146f0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69    ** required si
14700 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ze.  */.    asse
14710 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
14720 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14730 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
14740 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
14750 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ger, pPager->dbS
14760 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
14770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14780 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f  & bCommit && isO
14790 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
147a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
147b0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
147c0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
147d0 49 54 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54  ITE_FCNTL_COMMIT
147e0 5f 50 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20  _PHASETWO, 0);. 
147f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14800 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20  E_NOTFOUND ) rc 
14810 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
14820 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
14830 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
14840 20 20 20 26 26 20 28 21 70 61 67 65 72 55 73 65     && (!pagerUse
14850 57 61 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73  Wal(pPager) || s
14860 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
14870 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
14880 57 61 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20  Wal, 0)).  ){.  
14890 20 20 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c    rc2 = pagerUnl
148a0 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48  ockDb(pPager, SH
148b0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
148c0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
148d0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
148e0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
148f0 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
14900 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
14910 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65  aster = 0;..  re
14920 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
14930 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a  _OK?rc2:rc);.}..
14940 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
14950 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
14960 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
14970 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
14980 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
14990 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
149a0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
149b0 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
149c0 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64  e ERROR state, d
149d0 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
149e0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
149f0 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
14a00 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
14a10 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
14a20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
14a30 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
14a40 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
14a50 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
14a60 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
14a70 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
14a80 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 62  move the pager b
14a90 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
14aa0 65 2e 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d  e. If this .** m
14ab0 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65 20  eans that there 
14ac0 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
14ad0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
14ae0 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65  e-system, the ne
14af0 78 74 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  xt .** connectio
14b00 6e 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68  n to obtain a sh
14b10 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ared lock on the
14b20 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d 61   pager (which ma
14b30 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a  y be this one) .
14b40 2a 2a 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20  ** will roll it 
14b50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
14b60 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
14b70 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
14b80 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14b90 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
14ba0 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
14bb0 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
14bc0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
14bd0 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
14be0 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
14bf0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
14c00 45 52 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69  ERROR state. Whi
14c10 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
14c20 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
14c30 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
14c40 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
14c50 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
14c60 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
14c70 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
14c80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14c90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14ca0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
14cb0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
14cc0 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te!=PAGER_OPEN )
14cd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  {.    assert( as
14ce0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
14cf0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
14d00 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
14d10 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
14d20 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20  _LOCKED ){.     
14d30 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
14d40 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14d50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
14d60 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
14d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
14d80 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
14d90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
14da0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14db0 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61  eMode ){.      a
14dc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
14dd0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14de0 44 45 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67  DER );.      pag
14df0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
14e00 6f 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29  on(pPager, 0, 0)
14e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
14e20 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
14e30 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  r);.}../*.** Par
14e40 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
14e50 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
14e60 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
14e70 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
14e80 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
14e90 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
14ea0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
14eb0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
14ec0 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
14ed0 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
14ee0 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
14ef0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
14f00 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
14f10 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
14f20 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
14f30 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
14f40 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
14f50 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
14f60 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
14f70 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
14f80 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
14f90 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
14fa0 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
14fb0 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
14fc0 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
14fd0 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
14fe0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
14ff0 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
15000 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
15010 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
15020 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
15030 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
15040 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
15050 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
15060 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
15070 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
15080 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
15090 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
150a0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
150b0 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
150c0 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
150d0 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
150e0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
150f0 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
15100 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
15110 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
15120 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
15130 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
15140 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
15150 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
15160 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
15170 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
15180 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
15190 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
151a0 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
151b0 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
151c0 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
151d0 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
151e0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
151f0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
15200 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
15210 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
15220 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
15230 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
15240 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
15250 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
15260 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
15270 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15280 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
15290 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
152a0 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
152b0 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
152c0 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
152d0 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
152e0 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
152f0 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63  .** Report the c
15300 75 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65  urrent page size
15310 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
15320 65 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61  eserved bytes ba
15330 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64  ck.** to the cod
15340 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ec..*/.#ifdef SQ
15350 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73  LITE_HAS_CODEC.s
15360 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
15370 52 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72  ReportSize(Pager
15380 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
15390 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53   pPager->xCodecS
153a0 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70  izeChng ){.    p
153b0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
153c0 65 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43  eChng(pPager->pC
153d0 6f 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61  odec, pPager->pa
153e0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e     (int)pPager->
15410 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d  nReserve);.  }.}
15420 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15430 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15440 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20  X)     /* No-op 
15450 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  if we do not sup
15460 70 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a  port a codec */.
15470 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
15480 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
15490 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
154a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
154b0 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
154c0 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
154d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
154e0 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
154f0 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
15500 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
15510 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
15520 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
15530 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
15540 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
15550 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
15560 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
15570 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
15580 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
15590 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  ** The main roll
155a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
155b0 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  s checksums - th
155c0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
155d0 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74  nal does .** not
155e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
155f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
15600 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65  e page record re
15610 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15620 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
15630 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
15640 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  n the current va
15650 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
15660 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ize, then playba
15670 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64  ck is.** skipped
15680 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
15690 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
156a0 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f  * If pDone is no
156b0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  t NULL, then it 
156c0 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70  is a record of p
156d0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61  ages that have a
156e0 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70  lready.** been p
156f0 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20  layed back.  If 
15700 74 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66  the page at *pOf
15710 66 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79  fset has already
15720 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
15730 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72  k.** (if the cor
15740 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65  responding pDone
15750 20 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65   bit is set) the
15760 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62  n skip the playb
15770 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ack..** Make sur
15780 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20  e the pDone bit 
15790 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
157a0 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61   the *pOffset pa
157b0 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69  ge is set.** pri
157c0 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e  or to returning.
157d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
157e0 67 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63  ge record is suc
157f0 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66  cessfully read f
15800 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
15810 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e  urnal file.** an
15820 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74  d played back, t
15830 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
15840 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
15850 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
15860 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e  .** while readin
15870 67 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f  g the record fro
15880 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
15890 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c  nal file or whil
158a0 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20  e writing.** to 
158b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
158c0 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65  e, then the IO e
158d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
158e0 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a  urned. If data.*
158f0 2a 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c  * is successfull
15900 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  y read from the 
15910 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
15920 6c 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74  le but appears t
15930 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65  o be.** corrupte
15940 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
15950 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61  s returned. Data
15960 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63   is considered c
15970 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74  orrupted in.** t
15980 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
15990 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20  :.** .**   * If 
159a0 74 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d  the record page-
159b0 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61  number is illega
159c0 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a  l (0 or PAGER_MJ
159d0 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20  _PGNO), or.**   
159e0 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
159f0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
15a00 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
15a10 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  in journal file.
15a20 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63  **     and the c
15a30 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f  hecksum field do
15a40 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
15a50 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e   record content.
15a60 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f  .**.** Neither o
15a70 66 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e  f these two scen
15a80 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62  arios are possib
15a90 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65  le during a save
15aa0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  point rollback..
15ab0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73  **.** If this is
15ac0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
15ad0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f  lback, then memo
15ae0 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62  ry may have to b
15af0 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  e dynamically.**
15b00 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
15b10 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  is function. If 
15b20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
15b30 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69   and an allocati
15b40 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c  on fails,.** SQL
15b50 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
15b60 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
15b70 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
15b80 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20  ack_one_page(.  
15b90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
15ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15bb0 20 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67   The pager being
15bc0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
15bd0 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
15c00 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
15c10 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
15c20 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ne,             
15c30 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
15c40 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
15c50 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
15c60 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c80 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
15c90 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
15ca0 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
15cb0 53 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20  Savepnt         
15cc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15cd0 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
15ce0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20  rollback */.){. 
15cf0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
15d00 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
15d10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15d20 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
15d30 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
15d40 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d60 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
15d70 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
15d80 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
15d90 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
15da0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
15db0 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
15dc0 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
15dd0 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20    char *aData;  
15de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15df0 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f  /* Temporary sto
15e00 72 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67  rage for the pag
15e10 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
15e20 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20  ile *jfd;       
15e30 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
15e40 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
15e50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15e60 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63   */.  int isSync
15e70 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
15e80 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
15e90 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73  ournal page is s
15ea0 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  ynced */..  asse
15eb0 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
15ec0 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
15ed0 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
15ee0 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
15ef0 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
15f00 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
15f10 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
15f20 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
15f30 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
15f40 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
15f50 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
15f60 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
15f70 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
15f80 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
15f90 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
15fa0 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
15fb0 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
15fc0 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
15fd0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
15fe0 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
15ff0 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
16000 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
16010 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16020 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
16030 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
16040 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30  seWal(pPager)==0
16050 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c   || (!isMainJrnl
16060 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29   && isSavepnt) )
16070 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74  ;..  /* Either t
16080 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61  he state is grea
16090 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57  ter than PAGER_W
160a0 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28  RITER_CACHEMOD (
160b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  a transaction . 
160c0 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74   ** or savepoint
160d0 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61   rollback done a
160e0 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66  t the request of
160f0 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20   the caller) or 
16100 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68  this is.  ** a h
16110 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16120 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20  ack. If it is a 
16130 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
16140 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a  back, the pager.
16150 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65    ** is in state
16160 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20   OPEN and holds 
16170 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
16180 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  k. Hot-journal r
16190 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c  ollback.  ** onl
161a0 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65  y reads from the
161b0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e   main journal, n
161c0 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ot the sub-journ
161d0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  al..  */.  asser
161e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
161f0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
16200 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20  CACHEMOD.       
16210 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  || (pPager->eSta
16220 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
16230 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  & pPager->eLock=
16240 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
16250 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
16260 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
16270 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
16280 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a  HEMOD || isMainJ
16290 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61  rnl );..  /* Rea
162a0 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  d the page numbe
162b0 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20  r and page data 
162c0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
162d0 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a   or sub-journal.
162e0 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72    ** file. Retur
162f0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
16300 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66  to the caller if
16310 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
16320 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20  urs..  */.  jfd 
16330 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70  = isMainJrnl ? p
16340 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
16350 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20  ger->sjfd;.  rc 
16360 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
16370 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e  , *pOffset, &pgn
16380 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
16390 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
163a0 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
163b0 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28  te3OsRead(jfd, (
163c0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
163d0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70  r->pageSize, (*p
163e0 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66  Offset)+4);.  if
163f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16400 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
16410 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65  pOffset += pPage
16420 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20  r->pageSize + 4 
16430 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a  + isMainJrnl*4;.
16440 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
16450 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
16460 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
16470 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16480 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
16490 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
164a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
164b0 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
164c0 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
164d0 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
164e0 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
164f0 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
16500 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16510 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
16520 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
16530 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
16540 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
16550 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
16560 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
16570 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
16580 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
16590 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
165a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
165b0 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72  Savepnt );.    r
165c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
165d0 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
165e0 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e  o>(Pgno)pPager->
165f0 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65  dbSize || sqlite
16600 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e  3BitvecTest(pDon
16610 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
16620 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61  ;.  }.  if( isMa
16640 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63  inJrnl ){.    rc
16650 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
16660 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c  d, (*pOffset)-4,
16670 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
16680 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16690 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76  ;.    if( !isSav
166a0 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b  epnt && pager_ck
166b0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
166c0 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29  )aData)!=cksum )
166d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
166e0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
166f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
16700 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72  his page has alr
16710 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
16720 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72   back before dur
16730 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ing the current.
16740 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74    ** rollback, t
16750 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  hen don't bother
16760 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b   to play it back
16770 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69   again..  */.  i
16780 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20  f( pDone && (rc 
16790 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
167a0 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29  et(pDone, pgno))
167b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
167c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
167d0 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61  }..  /* When pla
167e0 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31  ying back page 1
167f0 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52  , restore the nR
16800 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20  eserve setting. 
16810 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
16820 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  1 && pPager->nRe
16830 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61  serve!=((u8*)aDa
16840 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70  ta)[20] ){.    p
16850 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20  Pager->nReserve 
16860 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32  = ((u8*)aData)[2
16870 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  0];.    pagerRep
16880 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
16890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
168a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41  e pager is in CA
168b0 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68  CHEMOD state, th
168c0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
168d0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
168e0 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
168f0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
16900 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
16910 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
16920 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
16930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16940 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
16950 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
16960 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
16970 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
16980 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
16990 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
169a0 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
169b0 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
169c0 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
169d0 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
169e0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
169f0 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
16a00 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
16a10 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
16a20 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
16a30 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
16a40 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
16a50 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
16a60 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
16a70 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
16a80 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
16a90 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
16aa0 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
16ab0 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
16ac0 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
16ad0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
16ae0 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
16af0 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45    ** If in WRITE
16b00 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f  R_DBMOD, WRITER_
16b10 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e  FINISHED or OPEN
16b20 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
16b30 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  update the.  ** 
16b40 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
16b50 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65  t exists and the
16b60 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
16b70 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
16b80 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69  ked .  ** not di
16b90 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20  rty. Since this 
16ba0 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65  code is only exe
16bb0 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f  cuted in PAGER_O
16bc0 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20  PEN state for.  
16bd0 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
16be0 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73   rollback, it is
16bf0 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
16c00 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
16c10 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66  is empty.  ** if
16c20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
16c30 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a   OPEN state..  *
16c40 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
16c50 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
16c60 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
16c70 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
16c80 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
16c90 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
16ca0 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
16cb0 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
16cc0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
16cd0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
16ce0 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
16cf0 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
16d00 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
16d10 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
16d20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
16d30 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
16d40 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
16d50 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
16d60 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
16d70 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
16d80 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
16d90 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
16da0 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
16db0 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
16dc0 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
16dd0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
16de0 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
16df0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
16e00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
16e10 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
16e20 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
16e30 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
16e40 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
16e50 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
16e60 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
16e70 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
16e80 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
16e90 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
16ea0 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
16eb0 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
16ec0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
16ed0 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
16ee0 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
16ef0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16f00 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
16f10 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
16f20 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
16f30 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
16f40 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
16f50 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
16f60 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
16f70 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
16f80 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
16f90 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16fa0 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
16fb0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
16fc0 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
16fd0 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
16fe0 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
16ff0 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
17000 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
17010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17020 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
17030 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
17040 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
17050 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
17060 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
17070 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
17080 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
17090 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
170a0 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
170b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
170c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
170d0 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  r) ){.    pPg = 
170e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
170f0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  pPg = sqlite3Pag
17100 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  erLookup(pPager,
17110 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73   pgno);.  }.  as
17120 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45  sert( pPg || !ME
17130 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
17140 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
17150 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
17160 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg==0 );.  PAGER
17170 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43 4b  TRACE(("PLAYBACK
17180 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
17190 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20  (%08x) %s\n",.  
171a0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
171b0 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
171c0 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
171d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
171e0 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20 20   (u8*)aData),.  
171f0 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
17200 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
17210 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
17220 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 69  ").  ));.  if( i
17230 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
17240 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61 67   isSynced = pPag
17250 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a  er->noSync || (*
17260 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67 65  pOffset <= pPage
17270 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a  r->journalHdr);.
17280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 53    }else{.    isS
17290 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30 20  ynced = (pPg==0 
172a0 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67  || 0==(pPg->flag
172b0 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  s & PGHDR_NEED_S
172c0 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  YNC));.  }.  if(
172d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
172e0 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67 65  fd).   && (pPage
172f0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17300 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c  _WRITER_DBMOD ||
17310 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
17320 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20 20  =PAGER_OPEN).   
17330 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29 7b  && isSynced.  ){
17340 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
17350 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
17360 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21 69      testcase( !i
17380 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67 21  sSavepnt && pPg!
17390 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  =0 && (pPg->flag
173a0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
173b0 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  C)!=0 );.    ass
173c0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
173d0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
173e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
173f0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
17400 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
17410 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
17420 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
17430 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
17440 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
17450 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
17460 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
17470 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17480 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
17490 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
174a0 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
174b0 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
174c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
174d0 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
174e0 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
174f0 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b  no, (u8*)aData);
17500 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
17510 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
17520 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
17530 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a 20  NOMEM, aData);. 
17540 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
17550 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20   !isMainJrnl && 
17560 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
17570 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f   If this is a ro
17580 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76 65  llback of a save
17590 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20 77  point and data w
175a0 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  as not written t
175b0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
175c0 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70 61  abase and the pa
175d0 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d  ge is not in-mem
175e0 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61 20  ory, there is a 
175f0 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a 2a  potential.    **
17600 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20 74   problem. When t
17610 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74 20  he page is next 
17620 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20 62  fetched by the b
17630 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74 20  -tree layer, it 
17640 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
17650 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
17660 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
17670 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ch may or may no
17680 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75 72  t be .    ** cur
17690 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  rent. .    **.  
176a0 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 61    ** There are a
176b0 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66 65   couple of diffe
176c0 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20 63  rent ways this c
176d0 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20 61  an happen. All a
176e0 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a 20  re quite.    ** 
176f0 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72 75  obscure. When ru
17700 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72 6f  nning in synchro
17710 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73 20  nous mode, this 
17720 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
17730 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 70  .    ** if the p
17740 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66 72  age is on the fr
17750 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20 73  ee-list at the s
17760 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
17770 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  saction, then.  
17780 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c 20    ** populated, 
17790 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e 67  then moved using
177a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
177b0 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  epage()..    **.
177c0 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74      ** The solut
177d0 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61 6e  ion is to add an
177e0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
177f0 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  to the cache con
17800 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  taining.    ** t
17810 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65 61  he data just rea
17820 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  d from the sub-j
17830 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68 65  ournal. Mark the
17840 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20 0a   page as dirty .
17850 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74 68      ** and if th
17860 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65 73  e pager requires
17870 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c   a journal-sync,
17880 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20 70   then mark the p
17890 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20 72  age as .    ** r
178a0 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72 6e  equiring a journ
178b0 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20 69  al-sync before i
178c0 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20 20  t is written..  
178d0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
178e0 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20   isSavepnt );.  
178f0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
17900 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
17910 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17920 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  CK)==0 );.    pP
17930 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
17940 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f   |= SPILLFLAG_RO
17950 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63 20 3d  LLBACK;.    rc =
17960 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
17970 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
17980 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  o, &pPg, 1);.   
17990 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
179a0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
179b0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
179c0 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)!=0 );.    pPa
179d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
179e0 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  &= ~SPILLFLAG_RO
179f0 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20  LLBACK;.    if( 
17a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
17a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
17a20 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
17a30 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
17a40 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
17a50 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
17a60 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
17a70 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
17a80 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
17a90 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
17aa0 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
17ab0 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
17ac0 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
17ad0 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
17ae0 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
17af0 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
17b00 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
17b10 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
17b20 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
17b30 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
17b40 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
17b50 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
17b60 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
17b70 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
17b80 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
17b90 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
17ba0 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
17bb0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
17bc0 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
17bd0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
17be0 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
17bf0 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
17c00 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17c10 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
17c20 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ter(pPg);.    if
17c30 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  ( isMainJrnl && 
17c40 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 2a  (!isSavepnt || *
17c50 70 4f 66 66 73 65 74 3c 3d 70 50 61 67 65 72 2d  pOffset<=pPager-
17c60 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a  >journalHdr) ){.
17c70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
17c80 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
17c90 20 70 61 67 65 20 77 65 72 65 20 6a 75 73 74 20   page were just 
17ca0 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 74 68  restored from th
17cb0 65 20 6d 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a  e main .      **
17cc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
17cd0 68 65 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  hen its content 
17ce0 6d 75 73 74 20 62 65 20 61 73 20 74 68 65 79 20  must be as they 
17cf0 77 65 72 65 20 77 68 65 6e 20 74 68 65 20 0a 20  were when the . 
17d00 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
17d10 69 6f 6e 20 77 61 73 20 66 69 72 73 74 20 6f 70  ion was first op
17d20 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  ened. In this ca
17d30 73 65 20 77 65 20 63 61 6e 20 6d 61 72 6b 20 74  se we can mark t
17d40 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
17d50 20 61 73 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65   as clean, since
17d60 20 74 68 65 72 65 20 77 69 6c 6c 20 62 65 20 6e   there will be n
17d70 6f 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  o need to write 
17d80 69 74 20 6f 75 74 20 74 6f 20 74 68 65 0a 20 20  it out to the.  
17d90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e      ** database.
17da0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
17db0 2a 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  ** There is one 
17dc0 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 69  exception to thi
17dd0 73 20 72 75 6c 65 2e 20 49 66 20 74 68 65 20 70  s rule. If the p
17de0 61 67 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  age is being rol
17df0 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  led.      ** bac
17e00 6b 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 73  k as part of a s
17e10 61 76 65 70 6f 69 6e 74 20 28 6f 72 20 73 74 61  avepoint (or sta
17e20 74 65 6d 65 6e 74 29 20 72 6f 6c 6c 62 61 63 6b  tement) rollback
17e30 20 66 72 6f 6d 20 61 6e 20 0a 20 20 20 20 20 20   from an .      
17e40 2a 2a 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  ** unsynced port
17e50 69 6f 6e 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ion of the main 
17e60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
17e70 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66  en it is not saf
17e80 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e.      ** to ma
17e90 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
17ea0 6c 65 61 6e 2e 20 54 68 69 73 20 69 73 20 62 65  lean. This is be
17eb0 63 61 75 73 65 20 6d 61 72 6b 69 6e 67 20 74 68  cause marking th
17ec0 65 20 70 61 67 65 20 61 73 0a 20 20 20 20 20 20  e page as.      
17ed0 2a 2a 20 63 6c 65 61 6e 20 77 69 6c 6c 20 63 6c  ** clean will cl
17ee0 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45  ear the PGHDR_NE
17ef0 45 44 5f 53 59 4e 43 20 66 6c 61 67 2e 20 53 69  ED_SYNC flag. Si
17f00 6e 63 65 20 74 68 65 20 70 61 67 65 20 69 73 0a  nce the page is.
17f10 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
17f20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
17f30 66 69 6c 65 20 28 72 65 63 6f 72 64 65 64 20 69  file (recorded i
17f40 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  n Pager.pInJourn
17f50 61 6c 29 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  al) and.      **
17f60 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
17f70 53 59 4e 43 20 66 6c 61 67 20 69 73 20 63 6c 65  SYNC flag is cle
17f80 61 72 65 64 2c 20 69 66 20 74 68 65 20 70 61 67  ared, if the pag
17f90 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a  e is written to.
17fa0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
17fb0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
17fc0 61 63 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20  action, it will 
17fd0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
17fe0 74 79 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20  ty but.      ** 
17ff0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
18000 59 4e 43 20 66 6c 61 67 20 77 69 6c 6c 20 6e 6f  YNC flag will no
18010 74 20 62 65 20 73 65 74 2e 20 49 74 20 63 6f 75  t be set. It cou
18020 6c 64 20 74 68 65 6e 20 70 6f 74 65 6e 74 69 61  ld then potentia
18030 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  lly.      ** be 
18040 77 72 69 74 74 65 6e 20 6f 75 74 20 69 6e 74 6f  written out into
18050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18060 6c 65 20 62 65 66 6f 72 65 20 69 74 73 20 6a 6f  le before its jo
18070 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20  urnal file.     
18080 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 73   ** segment is s
18090 79 6e 63 65 64 2e 20 49 66 20 61 20 63 72 61 73  ynced. If a cras
180a0 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  h occurs during 
180b0 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  or following thi
180c0 73 2c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  s,.      ** data
180d0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
180e0 6d 61 79 20 65 6e 73 75 65 2e 0a 20 20 20 20 20  may ensue..     
180f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
18100 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
18110 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
18120 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18130 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
18140 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
18150 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
18160 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
18170 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
18180 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
18190 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
181a0 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
181b0 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
181c0 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
181d0 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
181e0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
181f0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
18200 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
18210 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
18220 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
18230 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
18240 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
18250 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
18260 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
18270 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
18280 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
18290 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
182a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
182b0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
182c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
182d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
182e0 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
182f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
18300 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18310 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
18320 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
18330 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
18340 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18350 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
18360 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
18370 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18380 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
18390 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
183a0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
183b0 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
183c0 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
183d0 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
183e0 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
183f0 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
18400 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
18410 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
18420 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
18430 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
18440 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
18450 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
18460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
18470 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
18480 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
18490 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
184a0 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
184b0 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
184c0 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
184d0 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
184e0 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
184f0 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
18500 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
18510 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
18520 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
18530 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
18540 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
18550 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
18560 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
18570 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
18580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
18590 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
185a0 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
185b0 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
185c0 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
185d0 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
185e0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
185f0 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
18600 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
18610 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
18620 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
18630 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
18640 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
18650 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
18660 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
18670 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
18680 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
18690 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
186a0 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
186b0 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
186c0 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
186d0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
186e0 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
186f0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
18700 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
18710 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
18720 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
18730 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
18740 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
18750 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
18760 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
18770 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
18780 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
18790 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
187a0 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
187b0 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
187c0 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
187d0 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
187e0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
187f0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
18800 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
18810 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
18820 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
18830 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
18840 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
18850 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
18860 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
18870 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
18880 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
18890 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
188a0 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
188b0 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
188c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
188d0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
188e0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
188f0 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
18900 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
18910 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
18920 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
18930 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
18940 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
18950 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
18960 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
18970 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
18980 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
18990 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
189a0 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
189b0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
189c0 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
189d0 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
189e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
189f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
18a00 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
18a10 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
18a20 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
18a30 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
18a40 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
18a50 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
18a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18a70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
18a80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
18a90 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
18aa0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
18ab0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
18ac0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
18ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18ae0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
18af0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
18b00 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
18b10 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
18b20 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
18b30 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
18b40 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
18b50 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
18b60 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
18b70 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
18b80 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
18b90 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
18ba0 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
18bb0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
18bc0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
18bd0 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
18be0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
18bf0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
18c00 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18c10 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  *zJournal;      
18c20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
18c30 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77  to one journal w
18c40 69 74 68 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f  ithin MJ file */
18c50 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18c60 50 74 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ptr;         /* 
18c70 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a  Space to hold MJ
18c80 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61   filename from a
18c90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18ca0 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74  .  int nMasterPt
18cb0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
18cc0 41 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  Amount of space 
18cd0 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61  allocated to zMa
18ce0 73 74 65 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20  sterPtr[] */..  
18cf0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
18d00 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 70  e for both the p
18d10 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73  Journal and pMas
18d20 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  ter file descrip
18d30 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75  tors..  ** If su
18d40 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74  ccessful, open t
18d50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18d60 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  l file for readi
18d70 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74  ng..  */.  pMast
18d80 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  er = (sqlite3_fi
18d90 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  le *)sqlite3Mall
18da0 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f  ocZero(pVfs->szO
18db0 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
18dc0 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
18dd0 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
18de0 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
18df0 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
18e00 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
18e10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18e20 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
18e30 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
18e40 67 73 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45  gs = .#if SQLITE
18e50 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
18e60 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 28 70  TECTION.      (p
18e70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
18e80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
18e90 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
18ea0 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 28  |.#endif.      (
18eb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18ec0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
18ed0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
18ee0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18ef0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18f00 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
18f10 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
18f20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18f30 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18f40 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
18f50 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
18f60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18f70 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
18f80 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
18f90 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
18fa0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
18fb0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
18fc0 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
18fd0 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
18fe0 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
18ff0 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
19000 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
19010 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
19020 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
19030 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
19040 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
19050 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
19060 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
19070 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
19080 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
19090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
190a0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
190b0 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
190c0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
190d0 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
190e0 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
190f0 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  e3Malloc(nMaster
19100 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
19110 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28  rPtr + 1);.  if(
19120 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
19130 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
19140 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
19150 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19160 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  t;.  }.  zMaster
19170 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
19180 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
19190 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20  rnal+1];.  rc = 
191a0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
191b0 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
191c0 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73  urnal, (int)nMas
191d0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  terJournal, 0);.
191e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
191f0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
19200 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73  ster_out;.  zMas
19210 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
19220 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a  erJournal] = 0;.
19230 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d  .  zJournal = zM
19240 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
19250 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
19260 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
19270 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
19280 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74  ){.    int exist
19290 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
192a0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
192b0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  , zJournal, SQLI
192c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
192d0 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20  , &exists);.    
192e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
192f0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
19300 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
19310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69     }.    if( exi
19320 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  sts ){.      /* 
19330 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
19340 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
19350 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
19360 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
19370 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
19380 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
19390 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
193a0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
193b0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
193c0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
193d0 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
193e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
193f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
19400 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  c;.      int fla
19410 67 73 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45  gs = .#if SQLITE
19420 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
19430 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20  TECTION.        
19440 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67  (pPager->vfsFlag
19450 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49  s&SQLITE_OPEN_FI
19460 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53  LEPROTECTION_MAS
19470 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  K)|.#endif.     
19480 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
19490 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
194a0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
194b0 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
194c0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
194d0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
194e0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
194f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19510 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19520 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19530 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19540 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19550 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19560 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19570 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19580 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19590 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
195a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
195b0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
195c0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
195d0 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
195e0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
195f0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
19600 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
19610 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
19620 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
19630 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19640 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19650 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19660 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19670 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19690 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
196a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
196b0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
196c0 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
196d0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
196e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
196f0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
19700 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
19710 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
19720 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
19730 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19740 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19750 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19760 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19770 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19780 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19790 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
197a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
197b0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
197c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
197d0 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
197e0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
197f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
19800 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
19810 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
19820 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
19830 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19840 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19850 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19860 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19870 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19880 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19890 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
198a0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
198b0 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
198c0 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
198d0 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
198e0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
198f0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
19900 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
19910 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
19920 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
19930 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19940 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19950 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19960 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19970 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19980 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19990 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
199a0 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
199b0 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
199c0 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
199d0 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
199e0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
199f0 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
19a00 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
19a10 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
19a20 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
19a30 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
19a40 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
19a50 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
19a60 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
19a70 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
19a80 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
19a90 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
19aa0 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
19ab0 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
19ac0 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
19ad0 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
19ae0 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
19af0 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
19b00 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
19b10 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
19b20 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
19b30 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
19b40 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
19b50 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
19b60 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
19b70 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19b80 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
19b90 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
19ba0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
19bb0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
19bc0 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
19bd0 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
19be0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
19bf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
19c00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19c10 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
19c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19c30 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19c40 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a  ER_READER );.  .
19c50 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
19c60 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20  ger->fd) .   && 
19c70 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
19c80 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
19c90 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
19ca0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
19cb0 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  N) .  ){.    i64
19cc0 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
19cd0 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  wSize;.    int s
19ce0 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
19cf0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  pageSize;.    as
19d00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
19d10 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
19d20 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f  OCK );.    /* TO
19d30 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
19d40 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
19d50 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
19d60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19d70 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
19d80 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
19d90 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
19da0 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29  e = szPage*(i64)
19db0 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
19dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19dd0 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
19de0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
19df0 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
19e00 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
19e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
19e20 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
19e30 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
19e40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
19e50 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67  urrentSize+szPag
19e60 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  e)<=newSize ){. 
19e70 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d         char *pTm
19e80 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  p = pPager->pTmp
19e90 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d  Space;.        m
19ea0 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73  emset(pTmp, 0, s
19eb0 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  zPage);.        
19ec0 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
19ed0 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75  ze-szPage) == cu
19ee0 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
19ef0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
19f00 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
19f10 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  >  currentSize )
19f20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
19f30 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
19f40 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20  ager->fd, pTmp, 
19f50 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d  szPage, newSize-
19f60 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  szPage);.      }
19f70 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
19f80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19f90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
19fa0 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  leSize = nPage;.
19fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19fc0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19fd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
19fe0 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69   sanitized versi
19ff0 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  on of the sector
1a000 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65  -size of OS file
1a010 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72   pFile. The.** r
1a020 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67  eturn value is g
1a030 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65  uaranteed to lie
1a040 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20   between 32 and 
1a050 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1a060 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
1a070 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1a080 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1a090 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c    int iRet = sql
1a0a0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1a0b0 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69  (pFile);.  if( i
1a0c0 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52  Ret<32 ){.    iR
1a0d0 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  et = 512;.  }els
1a0e0 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53  e if( iRet>MAX_S
1a0f0 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
1a100 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
1a110 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
1a120 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58  ;.    iRet = MAX
1a130 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1a140 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b  }.  return iRet;
1a150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1a160 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
1a170 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1a180 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
1a190 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
1a1a0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
1a1b0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1a1c0 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
1a1d0 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
1a1e0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1a1f0 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
1a200 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
1a210 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
1a220 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
1a230 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
1a240 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
1a250 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1a260 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
1a270 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
1a280 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
1a290 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1a2a0 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
1a2b0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
1a2c0 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1a2d0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1a2e0 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
1a2f0 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
1a300 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a310 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
1a320 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1a330 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1a340 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
1a350 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a  ed up to 32 if.*
1a360 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  * it is less tha
1a370 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64  n 32, or rounded
1a380 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
1a390 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
1a3a0 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
1a3b0 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
1a3c0 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1a3d0 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c  file has the SQL
1a3e0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1a3f0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72  AFE_OVERWRITE pr
1a400 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74  operty, then set
1a410 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76  .** the effectiv
1a420 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f  e sector size to
1a430 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   its minimum val
1a440 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70  ue (512).  The p
1a450 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61  urpose of.** pPa
1a460 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a470 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  is to define the
1a480 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20   "blast radius" 
1a490 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a  of bytes that.**
1a4a0 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66   might change if
1a4b0 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
1a4c0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
1a4d0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1a4e0 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e  n.** that range.
1a4f0 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52    But with POWER
1a500 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20  SAFE_OVERWRITE, 
1a510 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73  the blast radius
1a520 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61   is zero.** (tha
1a530 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53  t is what POWERS
1a540 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65  AFE_OVERWRITE me
1a550 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69  ans), so we mini
1a560 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a  mize the sector.
1a570 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61  ** size.  For ba
1a580 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
1a590 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c  ility of the rol
1a5a0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
1a5b0 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65  le format,.** we
1a5c0 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74   cannot reduce t
1a5d0 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a5e0 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35  tor size below 5
1a5f0 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
1a600 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
1a610 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a620 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1a630 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1a640 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1a650 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  e );..  if( pPag
1a660 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20  er->tempFile.   
1a670 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
1a680 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a690 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26  cs(pPager->fd) &
1a6a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1a6b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1a6c0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a6d0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
1a6e0 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
1a6f0 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
1a700 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1a710 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
1a720 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
1a730 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1a740 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
1a750 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
1a760 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
1a770 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
1a780 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1a790 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
1a7a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a7b0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1a7c0 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f  e = sqlite3Secto
1a7d0 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
1a7e0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a7f0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
1a800 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
1a810 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
1a820 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
1a830 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1a840 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
1a850 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
1a860 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
1a870 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a880 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
1a890 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
1a8a0 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
1a8b0 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
1a8c0 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
1a8d0 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
1a8e0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a8f0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1a900 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
1a910 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
1a920 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1a930 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
1a940 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1a950 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
1a960 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
1a970 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
1a980 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1a990 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
1a9a0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a9b0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a9c0 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
1a9d0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
1a9e0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
1a9f0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
1aa00 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
1aa10 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1aa20 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
1aa30 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
1aa40 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
1aa50 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
1aa60 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
1aa70 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1aa80 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1aa90 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1aaa0 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
1aab0 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
1aac0 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
1aad0 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
1aae0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1aaf0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1ab00 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
1ab10 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
1ab20 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
1ab30 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
1ab40 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
1ab50 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
1ab60 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
1ab70 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
1ab80 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
1ab90 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
1aba0 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
1abb0 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1abc0 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
1abd0 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
1abe0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
1abf0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
1ac00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
1ac10 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
1ac20 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
1ac30 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
1ac40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1ac50 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1ac60 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
1ac70 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
1ac80 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
1ac90 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
1aca0 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
1acb0 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
1acc0 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
1acd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1ace0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
1acf0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
1ad00 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
1ad10 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
1ad20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1ad30 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
1ad40 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
1ad50 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
1ad60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1ad70 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
1ad80 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
1ad90 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
1ada0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1adb0 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
1adc0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
1add0 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
1ade0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
1adf0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
1ae00 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
1ae10 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
1ae20 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
1ae30 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
1ae40 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1ae50 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
1ae60 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
1ae70 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
1ae80 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
1ae90 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
1aea0 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
1aeb0 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1aec0 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
1aed0 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
1aee0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1aef0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
1af00 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
1af10 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
1af20 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
1af30 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
1af40 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
1af50 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
1af60 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
1af70 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
1af80 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
1af90 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
1afa0 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
1afb0 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
1afc0 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
1afd0 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
1afe0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
1aff0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
1b000 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
1b010 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1b020 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b030 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1b040 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1b050 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1b060 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1b070 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1b080 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1b090 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1b0a0 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1b0b0 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1b0c0 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1b0d0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1b0e0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1b0f0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1b100 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1b110 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1b120 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1b130 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1b140 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1b150 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1b160 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1b170 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1b180 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1b190 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1b1a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1b1b0 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1b1c0 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1b1d0 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1b1e0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1b1f0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1b200 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1b210 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1b220 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1b230 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1b240 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1b250 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1b260 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1b270 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1b280 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1b290 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1b2a0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1b2b0 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1b2c0 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1b2d0 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1b2e0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1b2f0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1b300 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1b310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1b320 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1b330 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1b340 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1b350 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1b360 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1b370 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1b380 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b390 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b3a0 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1b3b0 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1b3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b3d0 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1b3e0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1b3f0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b410 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1b420 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1b430 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1b440 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b450 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1b460 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1b470 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b480 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b490 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1b4a0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b4b0 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1b4c0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1b4d0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1b4e0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1b4f0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1b500 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1b510 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1b520 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1b530 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1b540 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1b550 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1b560 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1b570 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1b580 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62   */.  int nPlayb
1b590 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ack = 0;       /
1b5a0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1b5b0 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64  f pages restored
1b5c0 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
1b5d0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1b5e0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1b5f0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1b600 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1b610 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1b620 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1b630 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1b640 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1b650 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1b660 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1b670 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1b680 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1b690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b6a0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b6b0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1b6c0 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1b6d0 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1b6e0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1b6f0 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1b700 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1b710 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1b720 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1b730 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1b740 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1b750 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1b760 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1b770 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1b780 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1b790 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1b7a0 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1b7b0 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1b7c0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1b7d0 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1b7e0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1b7f0 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1b800 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1b810 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1b820 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1b830 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1b840 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1b850 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1b860 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1b870 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1b880 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1b890 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1b8a0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1b8b0 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1b8c0 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1b8d0 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1b8e0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1b8f0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1b900 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1b910 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1b920 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1b930 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1b940 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1b950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1b960 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1b970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b980 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1b990 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1b9a0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1b9b0 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1b9c0 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1b9d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1b9e0 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1b9f0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ba00 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1ba10 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1ba20 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1ba30 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1ba40 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1ba50 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1ba60 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1ba70 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1ba80 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1ba90 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1baa0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1bab0 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1bac0 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1bad0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1bae0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1baf0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1bb00 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bb10 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1bb20 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1bb30 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1bb40 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1bb50 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1bb60 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1bb70 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1bb80 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1bb90 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1bba0 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1bbb0 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1bbc0 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1bbd0 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1bbe0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1bbf0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1bc00 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1bc10 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1bc20 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1bc30 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1bc40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bc50 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1bc60 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1bc70 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1bc80 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1bc90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bca0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1bcb0 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1bcc0 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1bcd0 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1bce0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1bcf0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1bd00 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1bd10 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1bd20 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1bd30 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1bd40 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1bd50 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1bd60 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1bd70 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1bd80 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1bd90 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1bda0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1bdb0 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1bdc0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1bdd0 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1bde0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bdf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1be00 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1be10 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1be20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1be30 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1be40 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1be50 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1be60 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1be70 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1be80 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1be90 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1bea0 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1beb0 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1bec0 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1bed0 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1bee0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1bef0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1bf00 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1bf10 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1bf20 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bf30 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1bf40 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1bf50 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1bf60 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1bf70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1bf80 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1bf90 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1bfa0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1bfb0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1bfc0 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1bfd0 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1bfe0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1bff0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1c000 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1c010 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1c020 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1c030 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1c040 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1c050 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1c060 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1c070 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1c080 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1c090 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1c0a0 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1c0b0 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1c0c0 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1c0d0 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1c0e0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1c0f0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1c100 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1c110 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1c120 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1c130 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1c140 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1c150 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c160 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1c170 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1c180 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1c190 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1c1a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c1b0 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1c1c0 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1c1d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1c1e0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c1f0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1c200 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1c210 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1c220 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1c230 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1c240 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1c250 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1c260 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1c270 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1c280 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1c290 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1c2a0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1c2b0 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1c2c0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1c2d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c2e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c2f0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1c300 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1c310 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c320 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1c330 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1c340 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c350 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c360 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c370 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c380 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1c390 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1c3a0 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1c3b0 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1c3c0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1c3d0 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1c3e0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c3f0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1c400 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1c410 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1c420 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1c430 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1c440 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1c450 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c460 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1c470 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1c480 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1c490 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c4a0 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1c4b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c4c0 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1c4d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c4e0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1c4f0 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1c500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1c510 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c530 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c540 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1c550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c560 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c570 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c580 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c590 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1c5a0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1c5b0 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1c5c0 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1c5d0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1c5e0 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1c5f0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1c600 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1c610 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1c620 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1c630 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1c640 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1c650 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1c660 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1c670 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1c680 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1c690 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1c6a0 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1c6b0 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1c6c0 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1c6d0 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1c6e0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1c6f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1c700 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c710 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c720 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c740 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1c750 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1c760 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1c770 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1c780 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1c790 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1c7a0 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1c7b0 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1c7c0 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1c7d0 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1c7e0 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1c7f0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1c800 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1c810 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1c820 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1c830 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1c840 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1c850 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1c860 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1c870 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c890 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1c8a0 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1c8b0 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1c8c0 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1c8d0 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1c8e0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1c8f0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1c900 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1c910 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1c920 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1c930 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1c940 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1c950 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1c960 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1c970 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1c980 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1c990 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1c9a0 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1c9b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1c9c0 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1c9d0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1c9e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1c9f0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1ca00 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1ca10 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1ca20 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1ca30 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1ca40 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1ca50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1ca60 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1ca70 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1ca80 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1ca90 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1caa0 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1cab0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1cac0 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1cad0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1cae0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1caf0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1cb00 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1cb10 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1cb20 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cb30 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1cb40 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1cb50 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1cb60 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1cb70 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1cb80 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1cb90 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1cba0 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1cbb0 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1cbc0 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1cbd0 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1cbe0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1cbf0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1cc00 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1cc10 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1cc20 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1cc30 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1cc40 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1cc50 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1cc60 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1cc70 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1cc80 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1cc90 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1cca0 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1ccb0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1ccc0 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1ccd0 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1cce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ccf0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1cd00 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1cd10 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1cd20 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1cd30 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1cd40 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1cd50 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1cd60 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1cd70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1cd80 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cd90 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1cda0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1cdb0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1cdc0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1cdd0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1cde0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1cdf0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1ce00 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1ce10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ce20 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1ce30 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1ce40 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1ce50 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1ce60 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1ce70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1ce80 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1ce90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1cea0 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1ceb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1cec0 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1ced0 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1cee0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1cef0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1cf00 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1cf10 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1cf20 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1cf30 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1cf40 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1cf50 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1cf60 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1cf70 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1cf80 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1cf90 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1cfa0 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1cfb0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1cfc0 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1cfd0 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1cfe0 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1cff0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d000 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1d010 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d020 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1d030 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1d040 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1d050 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1d060 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1d070 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1d080 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1d090 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1d0a0 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1d0b0 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1d0c0 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1d0d0 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d0e0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1d0f0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1d100 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1d110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d120 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1d130 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1d140 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1d150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d160 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1d170 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1d180 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1d190 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1d1a0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d1b0 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1d1c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d1d0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1d1e0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1d1f0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1d200 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1d210 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1d220 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1d230 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d240 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1d250 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1d260 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1d270 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d280 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1d290 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1d2a0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d2b0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1d2c0 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1d2d0 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69  gHdr *pPg, u32 i
1d2e0 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20  Frame){.  Pager 
1d2f0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d300 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1d310 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1d320 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1d330 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1d340 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1d350 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1d360 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1d370 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d380 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1d390 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1d3a0 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1d3b0 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1d3c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d3d0 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1d3e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1d3f0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1d400 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1d410 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1d420 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1d430 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d440 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46  MIT_WAL.  if( iF
1d450 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1d460 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1d470 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1d480 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1d490 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d4a0 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1d4b0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1d4c0 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1d4d0 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Data);.  }else.#
1d4e0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36  endif.  {.    i6
1d4f0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1d500 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1d510 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1d520 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1d530 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1d540 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1d550 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1d560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d570 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d580 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d590 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1d5a0 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1d5b0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1d5c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d5d0 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1d5e0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1d5f0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1d600 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1d610 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1d620 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1d630 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1d640 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1d650 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1d660 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1d670 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1d680 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1d690 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1d6a0 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1d6b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1d6c0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1d6d0 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1d6e0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1d6f0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1d700 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1d710 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1d720 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1d730 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1d740 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1d750 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1d760 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1d770 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d780 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1d790 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1d7a0 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1d7b0 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1d7c0 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1d7d0 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1d7e0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1d7f0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1d800 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1d810 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1d820 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1d830 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1d840 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1d850 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1d860 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1d870 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1d880 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1d890 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1d8a0 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1d8b0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1d8c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d8d0 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1d8e0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1d8f0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1d900 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1d910 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d920 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d930 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d940 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1d950 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1d960 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1d970 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1d980 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1d990 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1d9a0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1d9b0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1d9c0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1d9d0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1d9e0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1d9f0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1da00 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1da10 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1da20 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1da30 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1da40 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1da50 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1da60 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1da70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1da80 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1da90 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1daa0 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1dab0 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1dac0 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1dad0 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1dae0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1daf0 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1db00 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1db10 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1db20 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1db30 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1db40 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1db50 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1db60 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1db70 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1db80 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1db90 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1dba0 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1dbb0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1dbc0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1dbd0 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1dbe0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1dbf0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1dc00 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1dc10 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1dc20 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1dc30 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1dc40 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1dc50 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1dc60 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1dc70 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1dc80 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1dc90 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1dca0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1dcb0 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1dcc0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1dcd0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1dce0 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1dcf0 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1dd00 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1dd10 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1dd20 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1dd30 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1dd40 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1dd50 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1dd60 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1dd70 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1dd80 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1dd90 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1dda0 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1ddb0 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1ddc0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1ddd0 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1dde0 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1ddf0 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1de00 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1de10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1de20 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1de30 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1de40 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1de50 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1de60 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1de70 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1de80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1de90 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1dea0 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1deb0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1dec0 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1ded0 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1dee0 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1def0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1df00 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1df10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1df20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1df30 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1df40 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1df50 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1df60 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1df70 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1df80 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1df90 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1dfa0 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1dfb0 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1dfc0 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1dfd0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1dfe0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1dff0 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1e000 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1e010 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1e020 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1e030 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1e040 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1e050 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e060 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1e070 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1e080 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1e090 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1e0a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e0b0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1e0c0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1e0d0 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1e0e0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1e0f0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e100 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1e110 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1e120 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1e130 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1e140 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1e150 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1e160 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1e170 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1e180 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1e190 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1e1a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1e1b0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1e1c0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e1d0 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1e1e0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1e1f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e200 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e210 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1e220 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1e230 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1e240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e250 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1e260 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1e270 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e280 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1e290 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1e2a0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1e2b0 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1e2c0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1e2d0 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1e2e0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1e2f0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1e300 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1e310 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1e320 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1e330 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1e340 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1e350 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1e360 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1e370 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1e380 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1e390 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1e3a0 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1e3b0 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1e3c0 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1e3d0 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1e3e0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e3f0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1e400 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1e410 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1e420 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1e430 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1e440 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1e450 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1e460 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1e470 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1e480 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1e490 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1e4a0 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1e4b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e4c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e4d0 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1e4e0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1e4f0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1e500 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1e510 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1e520 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1e530 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e560 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1e570 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1e580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e590 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1e5a0 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1e5b0 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1e5c0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1e5d0 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1e5e0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1e5f0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1e600 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1e610 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1e620 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1e630 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1e640 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1e650 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1e660 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1e670 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1e680 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1e690 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1e6a0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1e6b0 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1e6c0 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1e6d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1e6e0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1e6f0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1e700 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1e710 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1e720 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1e730 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1e740 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1e750 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1e760 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1e770 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1e780 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1e790 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1e7a0 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1e7b0 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1e7c0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1e7d0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1e7e0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1e7f0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1e800 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1e810 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e820 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1e830 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1e840 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1e850 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1e860 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1e870 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1e880 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1e890 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1e8a0 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1e8b0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1e8c0 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1e8d0 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1e8e0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1e8f0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1e900 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1e910 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1e920 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1e930 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1e940 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1e950 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1e960 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1e970 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1e980 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1e990 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1e9a0 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1e9b0 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1e9c0 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1e9d0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1e9e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1e9f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1ea00 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ea20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1ea30 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1ea40 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1ea50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1ea60 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1ea70 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1ea80 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eaa0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1eab0 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1eac0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1eaf0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1eb00 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1eb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1eb20 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1eb30 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1eb40 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1eb60 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1eb70 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1eb80 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1eb90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1eba0 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1ebb0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1ebc0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1ebd0 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1ebe0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1ebf0 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1ec00 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1ec10 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ec20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1ec30 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1ec40 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1ec50 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1ec60 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1ec70 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1ec80 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1ec90 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1eca0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ecb0 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1ecc0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1ecd0 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1ece0 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1ecf0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1ed00 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1ed10 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1ed20 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1ed30 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1ed40 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1ed50 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1ed60 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1ed70 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1ed80 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1ed90 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1eda0 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1edb0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1edc0 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1edd0 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1ede0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1edf0 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1ee00 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1ee10 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1ee20 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1ee30 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1ee40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1ee50 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1ee60 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1ee70 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1ee80 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1ee90 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1eea0 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1eeb0 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1eec0 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1eed0 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1eee0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1eef0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1ef00 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1ef10 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1ef20 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1ef30 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1ef40 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1ef50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ef60 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1ef70 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1ef80 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1ef90 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1efa0 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1efb0 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1efc0 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1efd0 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1efe0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1eff0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1f000 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1f010 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f020 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f030 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1f040 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f050 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1f060 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1f070 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1f080 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f090 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1f0a0 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1f0b0 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1f0c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f0d0 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1f0e0 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1f0f0 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1f100 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1f110 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1f120 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1f130 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1f140 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1f150 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1f160 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1f170 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1f180 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1f190 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1f1a0 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1f1b0 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1f1c0 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1f1d0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1f1e0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1f1f0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1f200 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f230 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1f240 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1f250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1f260 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1f270 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1f280 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1f290 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1f2a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f2b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f2c0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1f2d0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1f2e0 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1f2f0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f300 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1f310 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1f320 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1f330 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1f340 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1f350 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1f360 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1f370 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1f380 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1f390 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1f3a0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1f3b0 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1f3c0 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1f3d0 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1f3e0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f3f0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1f400 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1f410 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1f420 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1f430 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1f440 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1f450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f460 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
1f470 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1f480 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
1f490 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
1f4a0 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
1f4b0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
1f4c0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
1f4d0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1f4e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f4f0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f500 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1f510 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1f520 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1f530 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1f540 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1f550 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f560 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1f570 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1f580 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1f590 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1f5a0 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1f5b0 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1f5c0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1f5d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1f5e0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1f5f0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f600 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1f610 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1f620 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1f630 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1f640 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1f650 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1f660 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1f670 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1f680 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1f690 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1f6a0 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1f6b0 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1f6c0 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1f6d0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1f6e0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1f6f0 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1f700 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1f710 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1f720 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1f730 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1f740 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1f750 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1f760 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1f770 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1f780 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1f790 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1f7a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f7b0 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1f7c0 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1f7d0 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1f7e0 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1f7f0 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1f800 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1f810 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1f820 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1f830 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1f840 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1f850 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1f860 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f870 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f890 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f8a0 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
1f8b0 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1f8c0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1f8d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75  ..  /* If the nu
1f8e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f8f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f900 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1f910 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c  rom the.  ** WAL
1f920 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74   sub-system, det
1f930 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20  ermine the page 
1f940 63 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e 20  counte based on 
1f950 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
1f960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f970 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
1f980 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f990 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
1f9a0 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
1f9b0 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
1f9c0 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
1f9d0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
1f9e0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
1f9f0 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1fa00 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fa10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1fa20 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1fa30 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1fa40 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1fa50 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1fa60 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1fa70 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1fa80 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1fa90 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1faa0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1fab0 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1fac0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1fae0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1faf0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1fb00 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
1fb10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
1fb20 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1fb30 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
1fb40 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1fb50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1fb60 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1fb70 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1fb80 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1fb90 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1fba0 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1fbb0 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1fbc0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1fbd0 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1fbe0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1fbf0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1fc00 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1fc10 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1fc20 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1fc30 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1fc40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fc50 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1fc60 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1fc70 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1fc80 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1fc90 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1fca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1fcb0 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1fcc0 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1fcd0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1fce0 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1fcf0 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1fd00 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1fd10 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1fd20 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1fd30 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1fd40 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1fd50 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1fd60 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1fd70 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1fd80 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1fd90 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1fda0 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1fdb0 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1fdc0 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1fdd0 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1fde0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1fdf0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1fe00 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1fe10 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1fe20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1fe30 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1fe40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1fe50 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1fe60 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1fe70 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1fe80 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1fe90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1fea0 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1feb0 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1fec0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1fed0 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1fee0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1fef0 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1ff00 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1ff10 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1ff20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1ff30 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
1ff40 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
1ff50 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
1ff60 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
1ff70 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
1ff80 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
1ff90 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
1ffa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ffb0 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
1ffc0 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
1ffd0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1ffe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1fff0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
20000 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
20010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20020 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
20030 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
20040 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
20050 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
20060 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
20070 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20080 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
20090 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
200a0 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
200b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
200c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
200d0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
200e0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
200f0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
20100 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
20110 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
20120 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
20130 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20140 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
20150 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
20160 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
20170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
20180 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
20190 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
201a0 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  OK;.      isWal 
201b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
201c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
201d0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
201e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
201f0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
20200 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
20210 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
20220 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
20230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
20250 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
20260 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
20270 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
20280 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
20290 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
202a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
202b0 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
202c0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
202d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
202e0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
202f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
20300 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
20310 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
20320 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
20330 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
20340 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
20350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
20360 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
20370 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
20380 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
20390 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
203a0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
203b0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
203c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
203d0 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
203e0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
203f0 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
20400 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
20410 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
20420 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
20430 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
20440 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
20450 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
20460 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
20470 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
20480 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
20490 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
204a0 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
204b0 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
204c0 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
204d0 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
204e0 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
204f0 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
20500 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
20510 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
20520 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
20530 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
20540 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
20550 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
20560 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
20570 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20580 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
20590 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
205a0 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
205b0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
205c0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
205d0 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
205e0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
205f0 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
20600 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
20610 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
20620 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
20630 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
20640 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
20650 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
20660 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
20670 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
20680 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
20690 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
206a0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
206b0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
206c0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
206d0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
206e0 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
206f0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
20700 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
20710 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
20720 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
20730 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
20740 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
20750 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
20760 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
20770 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20780 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
20790 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
207a0 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
207b0 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
207c0 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
207d0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
207e0 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
207f0 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
20800 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
20810 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
20820 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
20830 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
20840 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
20850 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
20860 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
20870 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
20880 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
20890 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
208a0 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
208b0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
208c0 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
208d0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
208e0 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
208f0 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
20900 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
20910 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
20920 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
20930 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
20940 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
20950 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
20960 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
20970 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
20980 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
20990 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
209a0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
209b0 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
209c0 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
209d0 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
209e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
209f0 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
20a00 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
20a10 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
20a20 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
20a30 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
20a40 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
20a50 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
20a60 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
20a70 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
20a80 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
20a90 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
20aa0 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
20ab0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
20ac0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
20ad0 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
20ae0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
20af0 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
20b00 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
20b10 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
20b20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20b30 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20b40 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
20b50 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
20b60 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
20b70 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
20b80 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
20b90 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
20ba0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
20bb0 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
20bc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20bd0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
20be0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
20bf0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
20c00 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
20c10 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
20c20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
20c30 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
20c40 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20c50 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
20c60 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
20c70 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
20c80 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
20c90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20ca0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20cb0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
20cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
20cd0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
20ce0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
20cf0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
20d00 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
20d10 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
20d20 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
20d30 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
20d40 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
20d50 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
20d60 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
20d70 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20d80 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20d90 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20da0 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20db0 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20dc0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
20dd0 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
20de0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
20df0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
20e00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20e10 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
20e20 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
20e30 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
20e40 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
20e50 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
20e60 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
20e70 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
20e80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20e90 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
20ea0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
20eb0 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20ec0 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
20ed0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20ee0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
20ef0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
20f00 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
20f10 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
20f20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20f30 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
20f40 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
20f50 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
20f60 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
20f70 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
20f80 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
20f90 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20fa0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20fb0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
20fc0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
20fd0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
20fe0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
20ff0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21000 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
21010 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
21020 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
21030 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
21040 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
21050 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
21060 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
21070 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
21080 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
21090 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
210a0 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
210b0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
210c0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
210d0 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
210e0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
210f0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
21100 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
21110 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
21120 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
21130 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
21140 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
21150 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
21160 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
21170 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
21180 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
21190 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
211a0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
211b0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
211c0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
211d0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
211e0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
211f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21200 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21210 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
21220 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
21230 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
21240 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
21250 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
21260 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21270 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21280 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
21290 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
212a0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
212b0 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
212c0 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
212d0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
212e0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
212f0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
21300 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
21310 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
21320 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
21330 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
21340 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
21350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21360 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21370 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
21380 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21390 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
213a0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
213b0 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
213c0 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
213d0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
213e0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
213f0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
21400 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
21410 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
21420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
21430 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21440 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
21450 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
21460 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21470 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21480 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21490 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
214a0 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
214b0 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
214c0 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
214d0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
214e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
214f0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
21500 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
21510 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
21520 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
21530 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
21540 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21550 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21560 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21570 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
21580 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
21590 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
215a0 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
215b0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
215c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
215d0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
215e0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
215f0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
21600 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
21610 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21620 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21630 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21640 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21650 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21660 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21670 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21680 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
21690 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
216a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
216b0 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
216c0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
216d0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
216e0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
216f0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
21700 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
21710 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
21720 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
21730 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
21740 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
21750 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21760 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
21770 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
21780 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
21790 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
217a0 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
217b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
217c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
217d0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
217e0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
217f0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
21800 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
21810 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
21820 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21830 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21840 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
21850 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
21860 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
21870 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
21880 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
21890 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
218a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
218b0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
218c0 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
218d0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
218e0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
218f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
21900 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21910 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
21920 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
21930 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
21940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21950 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21960 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
21970 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
21980 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
21990 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
219a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
219b0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
219c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
219d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
219e0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
219f0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
21a00 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
21a10 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
21a20 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21a30 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
21a40 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
21a50 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
21a60 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
21a70 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
21a80 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
21a90 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c  /*.** Invoke SQL
21aa0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
21ab0 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65  IZE based on the
21ac0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
21ad0 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61  f szMmap..*/.sta
21ae0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69  tic void pagerFi
21af0 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20  xMaplimit(Pager 
21b00 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51  *pPager){.#if SQ
21b10 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
21b20 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66  ZE>0.  sqlite3_f
21b30 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72  ile *fd = pPager
21b40 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70  ->fd;.  if( isOp
21b50 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d  en(fd) && fd->pM
21b60 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
21b70 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=3 ){.    sqlit
21b80 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20  e3_int64 sz;.   
21b90 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a   sz = pPager->sz
21ba0 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72  Mmap;.    pPager
21bb0 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73  ->bUseFetch = (s
21bc0 7a 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  z>0);.    sqlite
21bd0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
21be0 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
21bf0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
21c00 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d  _SIZE, &sz);.  }
21c10 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
21c20 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
21c30 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
21c40 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d  memory mapping m
21c50 61 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ade of the datab
21c60 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  ase file..*/.voi
21c70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21c80 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72  tMmapLimit(Pager
21c90 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65   *pPager, sqlite
21ca0 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
21cb0 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  .  pPager->szMma
21cc0 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61  p = szMmap;.  pa
21cd0 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70  gerFixMaplimit(p
21ce0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
21cf0 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   Free as much me
21d00 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
21d10 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
21d20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21d30 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65  PagerShrink(Page
21d40 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
21d50 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e  lite3PcacheShrin
21d60 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  k(pPager->pPCach
21d70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
21d80 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20  ust settings of 
21d90 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f  the pager to tho
21da0 73 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  se specified in 
21db0 74 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61  the pgFlags para
21dc0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
21dd0 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c   "level" in pgFl
21de0 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
21df0 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74  HRONOUS_MASK set
21e00 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  s the robustness
21e10 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
21e20 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
21e30 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
21e40 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
21e50 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67  s by.** changing
21e60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
21e70 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
21e80 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
21e90 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  s..** There are 
21ea0 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
21eb0 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
21ec0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
21ed0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
21ee0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
21ef0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
21f00 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
21f10 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
21f20 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
21f30 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
21f40 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
21f50 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
21f60 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
21f70 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
21f80 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
21f90 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
21fa0 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
21fb0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
21fc0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
21fd0 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
21fe0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
21ff0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
22000 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
22010 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
22020 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
22030 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
22040 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
22050 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
22060 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
22070 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
22080 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
22090 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
220a0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
220b0 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
220c0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
220d0 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
220e0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
220f0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
22100 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
22110 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
22120 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
22130 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
22140 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
22150 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
22160 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
22170 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
22180 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
22190 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
221a0 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
221b0 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
221c0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
221d0 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
221e0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
221f0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
22200 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
22210 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
22220 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
22230 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
22240 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
22250 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
22260 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
22270 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
22280 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
22290 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
222a0 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66  * The above is f
222b0 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  or a rollback-jo
222c0 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72  urnal mode.  For
222d0 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63   WAL mode, OFF c
222e0 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d  ontinues.** to m
222f0 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63  ean that no sync
22300 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e  s ever occur.  N
22310 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74  ORMAL means that
22320 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63   the WAL is sync
22330 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74  ed.** prior to t
22340 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63  he start of chec
22350 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20  kpoint and that 
22360 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22370 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61  e is synced.** a
22380 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
22390 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69   of the checkpoi
223a0 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  nt if the entire
223b0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
223c0 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74  WAL.** was writt
223d0 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
223e0 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20   database.  But 
223f0 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f  no sync operatio
22400 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20  ns occur for.** 
22410 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d  an ordinary comm
22420 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64  it in NORMAL mod
22430 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c  e with WAL.  FUL
22440 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  L means that the
22450 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20   WAL.** file is 
22460 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
22470 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65   each commit ope
22480 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74  ration, in addit
22490 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79  ion to the.** sy
224a0 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ncs associated w
224b0 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a 2a 2a 0a 2a  ith NORMAL..**.*
224c0 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65  * Do not confuse
224d0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
224e0 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59  L with SQLITE_SY
224f0 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a  NC_FULL.  The.**
22500 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22510 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f  L macro means to
22520 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d   use the MacOSX-
22530 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63  style full-fsync
22540 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  .** using fcntl(
22550 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53  F_FULLFSYNC).  S
22560 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
22570 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e  L means to do an
22580 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79  .** ordinary fsy
22590 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72  nc() call.  Ther
225a0 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
225b0 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54  ce between SQLIT
225c0 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61  E_SYNC_FULL.** a
225d0 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  nd SQLITE_SYNC_N
225e0 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72  ORMAL on platfor
225f0 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61  ms other than Ma
22600 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a  cOSX.  But the.*
22610 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  * synchronous=FU
22620 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72  LL versus synchr
22630 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74  onous=NORMAL set
22640 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20  ting determines 
22650 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e  when.** the xSyn
22660 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63  c primitive is c
22670 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c  alled and is rel
22680 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61  evant to all pla
22690 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75  tforms..**.** Nu
226a0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
226b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
226c0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
226d0 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
226e0 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
226f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
22700 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
22710 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
22720 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20  PagerSetFlags(. 
22730 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
22740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
22750 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74  ger to set safet
22760 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20  y level for */. 
22770 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67   unsigned pgFlag
22780 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75  s      /* Variou
22790 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  s flags */.){.  
227a0 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d  unsigned level =
227b0 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
227c0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53  _SYNCHRONOUS_MAS
227d0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  K;.  assert( lev
227e0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
227f0 33 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  3 );.  pPager->n
22800 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
22810 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
22820 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
22830 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
22840 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
22850 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
22860 65 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70  e) ?1:0;.  if( p
22870 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
22880 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22890 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  cFlags = 0;.    
228a0 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
228b0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c  Flags = 0;.  }el
228c0 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  se if( pgFlags &
228d0 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43   PAGER_FULLFSYNC
228e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
228f0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22900 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
22910 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
22920 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22930 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
22940 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20  lse if( pgFlags 
22950 26 20 50 41 47 45 52 5f 43 4b 50 54 5f 46 55 4c  & PAGER_CKPT_FUL
22960 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50  LFSYNC ){.    pP
22970 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22980 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22990 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
229a0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
229b0 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
229c0 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
229d0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
229e0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
229f0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
22a00 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22a10 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22a20 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
22a30 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
22a40 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79  ags = pPager->sy
22a50 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  ncFlags;.  if( p
22a60 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
22a70 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
22a80 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57  alSyncFlags |= W
22a90 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
22aa0 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  IONS;.  }.  if( 
22ab0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
22ac0 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20  CACHESPILL ){.  
22ad0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
22ae0 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
22af0 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b  AG_OFF;.  }else{
22b00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
22b10 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
22b20 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a  FLAG_OFF;.  }.}.
22b30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
22b40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
22b50 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
22b60 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
22b70 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
22b80 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
22b90 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
22ba0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
22bb0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
22bc0 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
22bd0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
22be0 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
22bf0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
22c00 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
22c10 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
22c20 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
22c30 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
22c40 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
22c50 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
22c60 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
22c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
22c80 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
22c90 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
22ca0 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
22cb0 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
22cc0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
22cd0 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
22ce0 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
22cf0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
22d00 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
22d10 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
22d20 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
22d30 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
22d40 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
22d50 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
22d60 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
22d70 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
22d80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
22d90 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
22da0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
22db0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22dc0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
22dd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22de0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
22df0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
22e00 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
22e10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
22e20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
22e30 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
22e40 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
22e50 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
22e60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
22e70 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
22e80 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
22e90 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
22ea0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
22eb0 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
22ec0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
22ed0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
22ee0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
22ef0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
22f00 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
22f10 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
22f20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
22f30 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
22f40 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
22f50 7c 3d 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  |=  .#if SQLITE_
22f60 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
22f70 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ECTION.         
22f80 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46     (pPager->vfsF
22f90 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
22fa0 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f  _FILEPROTECTION_
22fb0 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20  MASK)|.#endif.  
22fc0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
22fd0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
22fe0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
22ff0 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
23000 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
23010 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54  XCLUSIVE | SQLIT
23020 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
23030 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c  LOSE;.  rc = sql
23040 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65  ite3OsOpen(pPage
23050 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c  r->pVfs, 0, pFil
23060 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b  e, vfsFlags, 0);
23070 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
23080 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
23090 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72  en(pFile) );.  r
230a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
230b0 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
230c0 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
230d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
230e0 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75  r invokes the bu
230f0 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71  sy-handler if sq
23100 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65  lite3OsLock() re
23110 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
23120 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e  _BUSY when tryin
23130 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  g to upgrade fro
23140 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53  m no-lock to a S
23150 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f  HARED lock,.** o
23160 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  r when trying to
23170 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
23180 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f  RESERVED lock to
23190 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a   an EXCLUSIVE .*
231a0 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20  * lock. It does 
231b0 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65  *not* invoke the
231c0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68   busy handler wh
231d0 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f  en upgrading fro
231e0 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52  m.** SHARED to R
231f0 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e  ESERVED, or when
23200 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20   upgrading from 
23210 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53  SHARED to EXCLUS
23220 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63  IVE.** (which oc
23230 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d  curs during hot-
23240 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
23250 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a  ). Summary:.**.*
23260 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20  *   Transition  
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20        | Invokes 
23290 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20  xBusyHandler.** 
232a0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
232b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
232c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
232d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
232e0 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e  NO_LOCK       ->
232f0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20   SHARED_LOCK    
23300 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41    | Yes.**   SHA
23310 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45  RED_LOCK   -> RE
23320 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c  SERVED_LOCK    |
23330 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f   No.**   SHARED_
23340 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53  LOCK   -> EXCLUS
23350 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a  IVE_LOCK   | No.
23360 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f  **   RESERVED_LO
23370 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f  CK -> EXCLUSIVE_
23380 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a  LOCK   | Yes.**.
23390 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68  ** If the busy-h
233a0 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20  andler callback 
233b0 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
233c0 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  , the lock is .*
233d0 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74  * retried. If it
233e0 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74   returns zero, t
233f0 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42  hen the SQLITE_B
23400 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20  USY error is.** 
23410 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
23420 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61  caller of the pa
23430 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
23440 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23450 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
23460 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
23470 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
23480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23490 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
234a0 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
234b0 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20  dler)(void *),  
234c0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
234d0 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65  r to busy-handle
234e0 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  r function */.  
234f0 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
23500 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20  erArg           
23510 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
23520 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73   to pass to xBus
23530 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20  yHandler */.){. 
23540 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
23550 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e  ndler = xBusyHan
23560 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  dler;.  pPager->
23570 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
23580 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  = pBusyHandlerAr
23590 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  g;..  if( isOpen
235a0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
235b0 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20      void **ap = 
235c0 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72  (void **)&pPager
235d0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  ->xBusyHandler;.
235e0 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69 6e      assert( ((in
235f0 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70  t(*)(void *))(ap
23600 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64  [0]))==xBusyHand
23610 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ler );.    asser
23620 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48  t( ap[1]==pBusyH
23630 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20  andlerArg );.   
23640 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
23650 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
23660 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
23670 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20  TL_BUSYHANDLER, 
23680 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d  (void *)ap);.  }
23690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
236a0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
236b0 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
236c0 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
236d0 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
236e0 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
236f0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
23700 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
23710 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
23720 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
23730 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
23740 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
23750 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
23760 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
23770 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
23780 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
23790 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
237a0 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   an SQLITE_IOERR
237b0 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72  _xxx sub-code or
237c0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
237d0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
237e0 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
237f0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
23800 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
23810 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
23820 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
23830 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
23840 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
23850 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
23860 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
23870 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
23880 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
23890 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
238a0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
238b0 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
238c0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
238d0 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
238e0 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
238f0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
23900 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
23910 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
23920 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
23930 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
23940 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
23950 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
23960 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
23970 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
23980 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
23990 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
239a0 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
239b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
239c0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
239d0 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
239e0 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
239f0 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
23a00 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
23a10 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
23a20 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
23a30 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
23a40 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
23a50 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
23a60 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
23a70 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
23a80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23a90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
23aa0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
23ab0 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
23ac0 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
23ad0 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
23ae0 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
23af0 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
23b00 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
23b10 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
23b20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
23b30 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
23b40 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
23b50 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
23b60 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
23b70 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
23b80 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
23b90 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
23ba0 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
23bb0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
23bc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23bd0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
23be0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32  ger *pPager, u32
23bf0 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74   *pPageSize, int
23c00 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e   nReserve){.  in
23c10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23c20 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f  ;..  /* It is no
23c30 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f  t possible to do
23c40 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70   a full assert_p
23c50 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65 72  ager_state() her
23c60 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20  e, as this.  ** 
23c70 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
23c80 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
23c90 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20  in PagerOpen(), 
23ca0 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74 65  before the state
23cb0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67  .  ** of the Pag
23cc0 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74  er object is int
23cd0 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65  ernally consiste
23ce0 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74  nt..  **.  ** At
23cf0 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20   one point this 
23d00 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65  function returne
23d10 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68  d an error if th
23d20 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a  e pager was in .
23d30 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52    ** PAGER_ERROR
23d40 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63   state. But sinc
23d50 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  e PAGER_ERROR st
23d60 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ate guarantees t
23d70 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  hat.  ** there i
23d80 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  s at least one o
23d90 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
23da0 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20  reference, this 
23db0 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
23dc0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61   a no-op for tha
23dd0 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20  t case anyhow.. 
23de0 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53   */..  u32 pageS
23df0 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
23e00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
23e10 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
23e20 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
23e30 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
23e40 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
23e50 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d    if( (pPager->m
23e60 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
23e70 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
23e80 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
23e90 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
23ea0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20  ->pPCache)==0 . 
23eb0 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26 26    && pageSize &&
23ec0 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29   pageSize!=(u32)
23ed0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
23ee0 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
23ef0 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20  *pNew = NULL;   
23f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
23f10 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20   temp space */. 
23f20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30     i64 nByte = 0
23f30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
23f40 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
23f50 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70  OPEN && isOpen(p
23f60 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23f70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23f80 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
23f90 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a  r->fd, &nByte);.
23fa0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23fb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23fc0 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61       pNew = (cha
23fd0 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d  r *)sqlite3PageM
23fe0 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b  alloc(pageSize);
23ff0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
24000 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
24010 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OMEM;.    }..   
24020 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24030 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
24040 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
24050 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
24060 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
24070 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
24080 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
24090 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
240a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
240b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
240c0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
240d0 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  mpSpace);.      
240e0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
240f0 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
24100 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
24110 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70   (Pgno)((nByte+p
24120 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53  ageSize-1)/pageS
24130 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ize);.      pPag
24140 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
24150 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  ageSize;.    }el
24160 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
24170 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b  3PageFree(pNew);
24180 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
24190 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65  PageSize = pPage
241a0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
241b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
241c0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73   ){.    if( nRes
241d0 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
241e0 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
241f0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
24200 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
24210 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
24220 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
24230 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
24240 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
24250 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
24260 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69  er);.    pagerFi
24270 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72  xMaplimit(pPager
24280 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24290 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
242a0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
242b0 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
242c0 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
242d0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
242e0 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
242f0 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
24300 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
24310 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
24320 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
24330 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
24340 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
24350 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
24360 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
24370 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
24380 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
24390 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
243a0 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
243b0 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
243c0 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
243d0 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
243e0 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
243f0 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
24400 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
24410 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
24420 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
24430 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
24440 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
24450 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
24460 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
24470 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
24480 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
24490 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
244a0 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
244b0 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
244c0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
244d0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
244e0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
244f0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
24500 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
24510 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
24520 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
24530 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
24540 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
24550 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
24560 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
24570 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
24580 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
24590 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
245a0 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
245b0 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
245c0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
245d0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
245e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
245f0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20  =PAGER_OPEN );  
24600 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e      /* Called on
24610 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e  ly by OP_MaxPgcn
24620 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  t */.  assert( p
24630 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70  Pager->mxPgno>=p
24640 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
24650 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74    /* OP_MaxPgcnt
24660 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a   enforces this *
24670 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  /.  return pPage
24680 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
24690 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
246a0 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
246b0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
246c0 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
246d0 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
246e0 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
246f0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
24700 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
24710 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
24720 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
24730 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
24740 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
24750 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
24760 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
24770 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
24780 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
24790 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
247a0 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
247b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
247c0 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
247d0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
247e0 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
247f0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
24800 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
24810 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
24820 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
24830 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24840 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
24850 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
24860 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
24870 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24880 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
24890 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
248a0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
248b0 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
248c0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
248d0 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
248e0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
248f0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
24900 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
24910 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
24920 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
24930 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
24940 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
24950 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
24960 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
24970 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
24980 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
24990 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
249a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
249b0 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
249c0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
249d0 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29   (zFilename=="")
249e0 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f  , or.** opened o
249f0 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68  n a file less th
24a00 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69  an N bytes in si
24a10 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62  ze, the output b
24a20 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f  uffer is.** zero
24a30 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
24a40 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72   returned. The r
24a50 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69  ationale for thi
24a60 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a  s is that this .
24a70 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  ** function is u
24a80 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61  sed to read data
24a90 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e  base headers, an
24aa0 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e  d a new transien
24ab0 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a  t or.** zero siz
24ac0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20  ed database has 
24ad0 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f  a header than co
24ae0 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
24af0 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a  of zeroes..**.**
24b00 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72   If any IO error
24b10 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49   apart from SQLI
24b20 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
24b30 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  EAD is encounter
24b40 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  ed,.** the error
24b50 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
24b60 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
24b70 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  and the contents
24b80 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75   of the.** outpu
24b90 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e  t buffer undefin
24ba0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
24bb0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
24bc0 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
24bd0 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
24be0 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
24bf0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24c00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
24c10 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
24c20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
24c30 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
24c40 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24c50 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72   );..  /* This r
24c60 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63  outine is only c
24c70 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69  alled by btree i
24c80 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
24c90 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
24ca0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
24cb0 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20    There has not 
24cc0 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e  been an opportun
24cd0 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f  ity to transitio
24ce0 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f  n.  ** to WAL mo
24cf0 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  de yet..  */.  a
24d00 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
24d10 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
24d20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
24d30 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
24d40 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
24d50 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
24d60 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
24d70 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
24d80 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
24d90 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
24da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
24db0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
24dc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
24dd0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
24de0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24df0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24e00 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ion may only be 
24e10 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65  called when a re
24e20 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
24e30 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  s open on.** the
24e40 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72   pager. It retur
24e50 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ns the total num
24e60 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
24e70 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
24e80 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20  .** However, if 
24e90 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77  the file is betw
24ea0 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d  een 1 and <page-
24eb0 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73  size> bytes in s
24ec0 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68  ize, then .** th
24ed0 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  is is considered
24ee0 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a   a 1 page file..
24ef0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
24f00 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
24f10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
24f20 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73   *pnPage){.  ass
24f30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
24f40 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
24f50 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
24f60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
24f70 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
24f80 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67  SHED );.  *pnPag
24f90 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d  e = (int)pPager-
24fa0 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a  >dbSize;.}.../*.
24fb0 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
24fc0 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24fd0 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20  locktype on the 
24fe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
24ff0 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f  f.** a similar o
25000 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69  r greater lock i
25010 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20  s already held, 
25020 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25030 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74   a no-op.** (ret
25040 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
25050 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a   immediately)..*
25060 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
25070 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
25080 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  n the lock using
25090 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
250a0 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65  . Invoke .** the
250b0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
250c0 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75  f the lock is cu
250d0 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
250e0 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a  lable. Repeat .*
250f0 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  * until the busy
25100 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
25110 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  s false or until
25120 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
25130 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c  .** obtain the l
25140 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
25150 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
25160 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
25170 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
25180 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
25190 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
251a0 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  k. If the lock i
251b0 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65  s obtained succe
251c0 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65  ssfully, set the
251d0 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a   Pager.state .**
251e0 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63   variable to loc
251f0 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74  ktype before ret
25200 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
25210 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
25220 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
25230 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
25240 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25270 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
25280 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
25290 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
252a0 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
252b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
252c0 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
252d0 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f  eady held), or o
252e0 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  ne of the transi
252f0 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
25300 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
25310 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
25320 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
25330 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
25340 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
25350 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
25360 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
25370 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
25380 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70  ->eLock>=locktyp
25390 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
253a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ager->eLock==NO_
253b0 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
253c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  ==SHARED_LOCK). 
253d0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
253e0 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
253f0 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  D_LOCK && lockty
25400 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
25410 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b  CK).  );..  do {
25420 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c  .    rc = pagerL
25430 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f  ockDb(pPager, lo
25440 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  cktype);.  }whil
25450 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
25460 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
25470 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
25480 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
25490 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  rg) );.  return 
254a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e  rc;.}../*.** Fun
254b0 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e  ction assertTrun
254c0 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  cateConstraint(p
254d0 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68  Pager) checks th
254e0 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a  at one of the .*
254f0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74  * following is t
25500 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74  rue for all dirt
25510 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  y pages currentl
25520 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  y in the page-ca
25530 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  che:.**.**   a) 
25540 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
25550 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
25560 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a  equal to the siz
25570 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20  e of the .**    
25580 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61    current databa
25590 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67  se image, in pag
255a0 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62  es, OR.**.**   b
255b0 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f  ) if the page co
255c0 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74  ntent were writt
255d0 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  en at this time,
255e0 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a   it would not.**
255f0 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61        be necessa
25600 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ry to write the 
25610 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20  current content 
25620 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  out to the sub-j
25630 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28  ournal.**      (
25640 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
25650 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65   function subjRe
25660 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a  quiresPage())..*
25670 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64  *.** If the cond
25680 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62  ition asserted b
25690 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
256a0 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
256b0 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  nd the.** dirty 
256c0 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20  page were to be 
256d0 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74  discarded from t
256e0 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65  he cache via the
256f0 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a   pagerStress().*
25700 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72  * routine, pager
25710 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e  Stress() would n
25720 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72  ot write the cur
25730 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
25740 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61  t to.** the data
25750 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20  base file. If a 
25760 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61  savepoint transa
25770 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65  ction were rolle
25780 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20  d back after.** 
25790 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74  this happened, t
257a0 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76  he correct behav
257b0 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ior would be to 
257c0 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72  restore the curr
257d0 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  ent.** content o
257e0 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65  f the page. Howe
257f0 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20  ver, since this 
25800 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70  content is not p
25810 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72  resent in either
25820 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
25830 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72   file or the por
25840 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c  tion of the roll
25850 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
25860 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   .** sub-journal
25870 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
25880 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e   content could n
25890 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  ot be restored a
258a0 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  nd the.** databa
258b0 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62  se image would b
258c0 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49  ecome corrupt. I
258d0 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66  t is therefore f
258e0 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a  ortunate that .*
258f0 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61  * this circumsta
25900 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65  nce cannot arise
25910 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
25920 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73  (SQLITE_DEBUG).s
25930 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
25940 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25950 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67  intCb(PgHdr *pPg
25960 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
25970 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
25980 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RTY );.  assert(
25990 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
259a0 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  ge(pPg) || pPg->
259b0 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65  pgno<=pPg->pPage
259c0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73  r->dbSize );.}.s
259d0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
259e0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
259f0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
25a00 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
25a10 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28  cheIterateDirty(
25a20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
25a30 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25a40 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a  onstraintCb);.}.
25a50 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61  #else.# define a
25a60 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25a70 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a  straint(pPager).
25a80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
25a90 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
25aa0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
25ab0 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
25ac0 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
25ad0 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
25ae0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
25af0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
25b00 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
25b10 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
25b20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
25b30 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
25b40 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
25b50 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
25b60 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
25b70 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
25b80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
25b90 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
25ba0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25bb0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67   only called rig
25bc0 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
25bd0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
25be0 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  on..** Once this
25bf0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65   function has be
25c00 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74  en called, the t
25c10 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
25c20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c  either be.** rol
25c30 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  led back or comm
25c40 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74  itted. It is not
25c50 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68   safe to call th
25c60 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a  is function and.
25c70 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65  ** then continue
25c80 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
25c90 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69  database..*/.voi
25ca0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
25cb0 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
25cc0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
25cd0 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
25ce0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
25cf0 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73  >=nPage );.  ass
25d00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
25d10 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
25d20 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
25d30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
25d40 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74   nPage;..  /* At
25d50 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63   one point the c
25d60 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20  ode here called 
25d70 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25d80 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20  nstraint() to.  
25d90 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61  ** ensure that a
25da0 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74  ll pages being t
25db0 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79  runcated away by
25dc0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
25dd0 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65  are,.  ** if one
25de0 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
25df0 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72  nts are open, pr
25e00 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76  esent in the sav
25e10 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75  epoint .  ** jou
25e20 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65  rnal so that the
25e30 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  y can be restore
25e40 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69  d if the savepoi
25e50 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a  nt is rolled.  *
25e60 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  * back. This is 
25e70 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73  no longer necess
25e80 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63  ary as this func
25e90 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79  tion is now only
25ea0 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67  .  ** called rig
25eb0 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74  ht before commit
25ec0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
25ed0 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20  on. So although 
25ee0 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20  the .  ** Pager 
25ef0 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c  object may still
25f00 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70   have open savep
25f10 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61  oints (Pager.nSa
25f20 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20  vepoint!=0), .  
25f30 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62  ** they cannot b
25f40 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53  e rolled back. S
25f50 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e  o the assertTrun
25f60 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29  cateConstraint()
25f70 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f   call.  ** is no
25f80 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e   longer correct.
25f90 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.}.../*.** Th
25fa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
25fb0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74  alled before att
25fc0 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  empting a hot-jo
25fd0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
25fe0 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20  It.** syncs the 
25ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
26000 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20  disk, then sets 
26010 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26020 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a  dr to the.** siz
26030 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
26040 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68   file so that th
26050 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
26060 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73  () routine knows
26070 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74  .** that the ent
26080 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ire journal file
26090 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
260a0 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20  ..**.** Syncing 
260b0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f  a hot-journal to
260c0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74   disk before att
260d0 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20  empting to roll 
260e0 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20  it back ensures 
260f0 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f  .** that if a po
26100 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75  wer-failure occu
26110 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
26120 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63  llback, the proc
26130 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65  ess that.** atte
26140 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f  mpts rollback fo
26150 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72  llowing system r
26160 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65  ecovery sees the
26170 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   same journal.**
26180 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73   content as this
26190 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
261a0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  If everything go
261b0 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53  es as planned, S
261c0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
261d0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
261e0 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65   .** an SQLite e
261f0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
26200 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79  atic int pagerSy
26210 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  ncHotJournal(Pag
26220 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
26230 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26240 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  K;.  if( !pPager
26250 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
26260 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
26270 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
26280 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
26290 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  AL);.  }.  if( r
262a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
262b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
262c0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
262d0 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
262e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20  >journalHdr);.  
262f0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
26300 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  ../*.** Obtain a
26310 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20   reference to a 
26320 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  memory mapped pa
26330 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61  ge object for pa
26340 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
26350 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65  .** The new obje
26360 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20  ct will use the 
26370 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f  pointer pData, o
26380 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65  btained from xFe
26390 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63  tch()..** If suc
263a0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70  cessful, set *pp
263b0 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Page to point to
263c0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72 65   the new page re
263d0 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72  ference.** and r
263e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
263f0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
26400 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
26410 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a  or code and set.
26420 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65  ** *ppPage to ze
26430 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72  ro..**.** Page r
26440 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e  eferences obtain
26450 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
26460 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
26470 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a  ld be released.*
26480 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67  * by calling pag
26490 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
264a0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
264b0 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61  t pagerAcquireMa
264c0 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  pPage(.  Pager *
264d0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
264e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
264f0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
26500 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26520 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
26530 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20    void *pData,  
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26550 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20    /* xFetch()'d 
26560 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70 61  data for this pa
26570 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a  ge */.  PgHdr **
26580 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20 20  ppPage          
26590 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
265a0 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f 62  Acquired page ob
265b0 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  ject */.){.  PgH
265c0 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265e0 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61  Memory mapped pa
265f0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ge to return */.
26600 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d    .  if( pPager-
26610 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29  >pMmapFreelist )
26620 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26630 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61  p = pPager->pMma
26640 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70  pFreelist;.    p
26650 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
26660 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79  list = p->pDirty
26670 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20  ;.    p->pDirty 
26680 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 0;.    memset(
26690 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50  p->pExtra, 0, pP
266a0 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
266b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
266c0 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72  age = p = (PgHdr
266d0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
266e0 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64  Zero(sizeof(PgHd
266f0 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  r) + pPager->nEx
26700 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d  tra);.    if( p=
26710 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
26720 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
26730 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
26740 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d  gno-1) * pPager-
26750 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61  >pageSize, pData
26760 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
26770 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26780 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72    }.    p->pExtr
26790 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31  a = (void *)&p[1
267a0 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  ];.    p->flags 
267b0 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20  = PGHDR_MMAP;.  
267c0 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
267d0 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70     p->pPager = p
267e0 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73  Pager;.  }..  as
267f0 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d  sert( p->pExtra=
26800 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29  =(void *)&p[1] )
26810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
26820 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
26830 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50  ert( p->flags==P
26840 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61  GHDR_MMAP );.  a
26850 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72  ssert( p->pPager
26860 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
26870 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31  sert( p->nRef==1
26880 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d   );..  p->pgno =
26890 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74   pgno;.  p->pDat
268a0 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61  a = pData;.  pPa
268b0 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b  ger->nMmapOut++;
268c0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
268d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
268e0 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
268f0 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20  ce to page pPg. 
26900 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  pPg must have be
26910 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  en returned by a
26920 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61  n .** earlier ca
26930 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69  ll to pagerAcqui
26940 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a  reMapPage()..*/.
26950 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
26960 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
26970 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
26980 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
26990 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50  Pg->pPager;.  pP
269a0 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d  ager->nMmapOut--
269b0 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20  ;.  pPg->pDirty 
269c0 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
269d0 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65  reelist;.  pPage
269e0 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
269f0 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72   = pPg;..  asser
26a00 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  t( pPager->fd->p
26a10 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
26a20 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65  n>=3 );.  sqlite
26a30 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
26a40 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67  r->fd, (i64)(pPg
26a50 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  ->pgno-1)*pPager
26a60 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d  ->pageSize, pPg-
26a70 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pData);.}../*.*
26a80 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72  * Free all PgHdr
26a90 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20   objects stored 
26aa0 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d  in the Pager.pMm
26ab0 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e  apFreelist list.
26ac0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26ad0 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
26ae0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26af0 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50  .  PgHdr *p;.  P
26b00 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66  gHdr *pNext;.  f
26b10 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d  or(p=pPager->pMm
26b20 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70  apFreelist; p; p
26b30 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
26b40 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  xt = p->pDirty;.
26b50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26b60 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (p);.  }.}.../*.
26b70 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
26b80 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
26b90 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
26ba0 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
26bb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
26bc0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
26bd0 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
26be0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
26bf0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
26c00 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
26c10 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
26c20 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
26c30 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
26c40 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
26c50 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
26c60 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
26c70 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
26c80 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
26c90 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
26ca0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
26cb0 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
26cc0 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
26cd0 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
26ce0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26cf0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
26d00 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
26d10 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
26d20 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
26d30 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
26d40 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
26d50 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
26d60 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
26d70 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
26d80 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
26d90 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
26da0 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
26db0 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
26dc0 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
26dd0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
26de0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26df0 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38    u8 *pTmp = (u8
26e00 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
26e10 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pace;..  assert(
26e20 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
26e30 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
26e40 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
26e50 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
26e60 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
26e70 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
26e80 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73  pagerFreeMapHdrs
26e90 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70  (pPager);.  /* p
26ea0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
26eb0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
26ec0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
26ed0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
26ee0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
26ef0 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
26f00 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67  ager->pWal, pPag
26f10 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
26f20 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  s, pPager->pageS
26f30 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50  ize, pTmp);.  pP
26f40 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
26f50 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
26f60 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
26f70 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
26f80 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
26f90 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
26fa0 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
26fb0 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
26fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
26fd0 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
26fe0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
26ff0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
27000 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
27010 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
27020 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
27030 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
27040 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
27050 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
27060 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
27070 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
27080 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
27090 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
270a0 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
270b0 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
270c0 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
270d0 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
270e0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
270f0 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
27100 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
27110 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
27120 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
27130 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
27140 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
27150 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
27160 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
27170 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
27180 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
27190 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
271a0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
271b0 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
271c0 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
271d0 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
271e0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
271f0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
27200 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
27210 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
27220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
27230 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
27240 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
27250 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
27260 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
27270 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
27280 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
27290 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
272a0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
272b0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
272c0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
272d0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
272e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
272f0 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
27300 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
27310 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27320 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
27330 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
27340 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
27350 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
27360 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
27370 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
27380 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
27390 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
273a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
273b0 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
273c0 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
273d0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
273e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
273f0 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
27400 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
27410 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
27420 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
27430 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
27440 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
27450 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
27460 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
27470 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
27480 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
27490 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
274a0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
274b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
274c0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
274d0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
274e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
274f0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
27500 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
27510 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
27520 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
27530 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
27540 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
27550 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
27560 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
27570 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
27580 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
27590 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
275a0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
275b0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
275c0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
275d0 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
275e0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
275f0 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
27600 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
27610 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
27620 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
27630 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
27640 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
27650 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
27660 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
27670 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
27680 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
27690 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
276a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
276b0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
276c0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
276d0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
276e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
276f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
27700 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
27710 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
27720 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
27730 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
27740 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
27750 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
27760 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
27770 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
27780 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
27790 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
277a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
277b0 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
277c0 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
277d0 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
277e0 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
277f0 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
27800 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
27810 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
27820 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
27830 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
27840 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
27850 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
27860 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
27870 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
27880 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
27890 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
278a0 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
278b0 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
278c0 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
278d0 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
278e0 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
278f0 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
27900 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
27910 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
27920 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
27930 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
27940 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
27950 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
27960 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
27970 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
27980 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
27990 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
279a0 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
279b0 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
279c0 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
279d0 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
279e0 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
279f0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
27a00 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
27a10 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
27a20 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
27a30 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
27a40 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
27a50 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
27a60 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
27a70 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
27a80 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
27a90 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
27aa0 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
27ab0 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
27ac0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
27ad0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
27ae0 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
27af0 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
27b00 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
27b10 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
27b20 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
27b30 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
27b40 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
27b50 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
27b60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
27b70 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
27b80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27b90 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
27ba0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
27bb0 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
27bc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
27be0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
27bf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
27c00 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
27c10 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
27c20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
27c30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
27c40 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
27c50 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
27c60 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
27c70 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
27c80 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
27c90 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
27ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
27cb0 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
27cc0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
27cd0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
27ce0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
27cf0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
27d00 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
27d10 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
27d20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
27d30 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
27d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
27d50 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
27d60 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
27d70 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
27d80 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
27d90 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
27da0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
27db0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27dc0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27dd0 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
27de0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
27df0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
27e00 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
27e10 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
27e20 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
27e30 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
27e40 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
27e50 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
27e60 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
27e70 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
27e80 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
27e90 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
27ea0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
27eb0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
27ec0 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
27ed0 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
27ee0 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
27ef0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
27f00 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
27f10 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
27f20 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
27f30 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
27f40 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
27f50 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
27f60 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
27f70 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
27f80 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
27f90 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
27fa0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
27fb0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
27fc0 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
27fd0 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
27fe0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
27ff0 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
28000 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
28010 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
28020 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
28030 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
28040 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
28050 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
28060 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
28070 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
28080 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
28090 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
280a0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
280b0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
280c0 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
280d0 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
280e0 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
280f0 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
28100 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
28110 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
28120 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
28130 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
28140 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
28150 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
28160 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
28170 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
28180 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28190 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
281a0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
281b0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
281c0 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
281d0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
281e0 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
281f0 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
28200 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
28210 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
28220 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
28230 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
28240 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
28250 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
28260 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28270 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
28280 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
28290 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
282a0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
282b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
282c0 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
282d0 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
282e0 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
282f0 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
28300 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
28310 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
28320 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
28330 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
28340 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
28350 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
28360 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
28370 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
28380 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
28390 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
283a0 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
283b0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
283c0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
283d0 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
283e0 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
283f0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
28400 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
28410 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
28420 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
28430 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
28440 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
28450 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
28460 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
28470 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
28480 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
28490 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
284a0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
284b0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
284c0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
284d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
284e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
284f0 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
28500 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
28510 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
28520 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
28530 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
28540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28550 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
28560 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
28570 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
28580 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
28590 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
285a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
285b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
285c0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
285d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
285e0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
285f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
28600 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
28610 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28620 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
28630 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
28640 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
28650 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
28660 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
28670 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
28680 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
28690 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
286a0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
286b0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
286c0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
286d0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
286e0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
286f0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28700 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
28710 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
28720 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
28730 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
28740 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
28750 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
28760 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
28770 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
28780 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
28790 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
287a0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
287b0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
287c0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
287d0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
287e0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
287f0 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
28800 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
28810 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
28820 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
28830 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
28840 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
28850 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
28860 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
28870 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
28880 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
28890 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
288a0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
288b0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
288c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
288d0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
288e0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
288f0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
28900 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28910 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
28920 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
28930 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
28940 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
28950 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28960 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28970 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
28980 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
28990 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
289a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
289b0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
289c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
289d0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
289e0 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
289f0 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
28a00 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
28a10 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
28a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28a40 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28a50 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
28a60 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
28a70 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
28a80 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
28a90 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
28aa0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
28ab0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
28ac0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
28ad0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
28ae0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
28af0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
28b00 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
28b10 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
28b20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
28b30 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
28b40 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
28b50 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
28b60 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
28b70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28b80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
28b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28ba0 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
28bb0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
28bc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
28be0 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
28bf0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
28c00 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
28c10 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
28c20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
28c30 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
28c40 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
28c50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28c60 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
28c80 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
28c90 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
28ca0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28cb0 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
28cc0 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
28cd0 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
28ce0 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
28cf0 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
28d00 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
28d10 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
28d20 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
28d30 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
28d40 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
28d50 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
28d60 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
28d70 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
28d80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
28d90 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
28da0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
28db0 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
28dc0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
28dd0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
28de0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28df0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
28e00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
28e10 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
28e20 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
28e30 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
28e40 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
28e50 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
28e60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
28e70 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
28e80 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
28e90 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
28ea0 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
28eb0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
28ec0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
28ed0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
28ee0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
28ef0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
28f00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
28f10 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
28f20 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
28f30 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
28f40 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
28f50 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
28f60 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
28f70 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
28f80 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
28f90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
28fa0 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
28fb0 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
28fc0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
28fd0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
28fe0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
28ff0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
29000 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
29010 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
29020 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29030 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
29040 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
29050 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
29060 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
29070 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
29080 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
29090 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
290a0 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
290b0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
290c0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
290d0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
290e0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
290f0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
29100 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
29110 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
29120 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
29130 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
29140 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
29150 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
29160 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
29170 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
29180 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
29190 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
291a0 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
291b0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
291c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
291d0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
291e0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
291f0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
29200 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
29210 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
29220 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
29230 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
29240 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
29250 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
29260 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
29270 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
29280 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
29290 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
292a0 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
292b0 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
292c0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
292d0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
292e0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
292f0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
29300 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
29310 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
29320 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
29330 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
29340 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
29350 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
29360 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
29370 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
29380 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
29390 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
293a0 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
293b0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
293c0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
293d0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
293e0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
293f0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
29400 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
29410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29430 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29440 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
29450 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
29460 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
29470 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
29480 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
29490 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
294a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
294b0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
294c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
294d0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
294e0 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OD );.  assert( 
294f0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
29500 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
29510 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
29520 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  le is a temp-fil
29530 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
29540 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
29550 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20  it now. It.  ** 
29560 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
29570 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68  for rc to be oth
29580 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
29590 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68  K if this branch
295a0 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20  .  ** is taken, 
295b0 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  as pager_wait_on
295c0 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  _lock() is a no-
295d0 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65  op for temp-file
295e0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69  s..  */.  if( !i
295f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
29600 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
29610 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
29620 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
29630 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  OK );.    rc = p
29640 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
29650 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
29660 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
29670 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65  s);.  }..  /* Be
29680 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
29690 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20 56  rite, give the V
296a0 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61  FS a hint of wha
296b0 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a  t the final.  **
296c0 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20   file size will 
296d0 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  be..  */.  asser
296e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
296f0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
29700 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20  r->fd) );.  if( 
29710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
29720 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48    && pPager->dbH
29730 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  intSize<pPager->
29740 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c  dbSize.   && (pL
29750 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70  ist->pDirty || p
29760 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  List->pgno>pPage
29770 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20  r->dbHintSize). 
29780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29790 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70  int64 szFile = p
297a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
297b0 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  * (sqlite3_int64
297c0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
297d0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
297e0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
297f0 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
29800 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
29810 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20  , &szFile);.    
29820 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
29830 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
29840 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ize;.  }..  whil
29850 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
29860 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
29870 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
29880 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
29890 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
298a0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
298b0 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
298c0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
298d0 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
298e0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
298f0 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
29900 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
29910 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
29920 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
29930 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
29940 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
29950 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
29960 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
29970 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
29980 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
29990 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
299a0 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
299b0 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
299c0 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
299d0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
299e0 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
299f0 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
29a00 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
29a10 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
29a20 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
29a30 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
29a40 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
29a50 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
29a60 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
29a70 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
29a80 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
29a90 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  e;   /* Offset t
29aa0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  o write */.     
29ab0 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20   char *pData;   
29ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ae0 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65  /* Data to write
29af0 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61   */    ..      a
29b00 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66  ssert( (pList->f
29b10 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
29b20 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20  SYNC)==0 );.    
29b30 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
29b40 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
29b50 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
29b60 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20  (pList);..      
29b70 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61  /* Encode the da
29b80 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
29b90 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
29ba0 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e  List->pData, pgn
29bb0 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 6, return SQL
29bc0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
29bd0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
29be0 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
29bf0 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
29c00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
29c10 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
29c20 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
29c30 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
29c40 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
29c50 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
29c60 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
29c70 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
29c80 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
29c90 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
29ca0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
29cb0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
29cc0 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
29cd0 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
29ce0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
29cf0 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
29d00 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
29d10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29d20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
29d30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
29d40 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
29d50 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
29d60 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
29d70 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
29d80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
29d90 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
29da0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
29db0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
29dc0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
29dd0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
29de0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
29df0 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20  AT_WRITE]++;..  
29e00 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e      /* Update an
29e10 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  y backup objects
29e20 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e   copying the con
29e30 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
29e40 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ger. */.      sq
29e50 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
29e60 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e(pPager->pBacku
29e70 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c  p, pgno, (u8*)pL
29e80 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20  ist->pData);..  
29e90 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
29ea0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
29eb0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
29ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29ed0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
29ee0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
29ef0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
29f00 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
29f10 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
29f20 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
29f30 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
29f40 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
29f50 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
29f60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29f70 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
29f80 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
29f90 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29fa0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
29fb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
29fc0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c  _set_pagehash(pL
29fd0 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  ist);.    pList 
29fe0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
29ff0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2a000 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  c;.}../*.** Ensu
2a010 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62 2d  re that the sub-
2a020 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2a030 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61  open. If it is a
2a040 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69  lready open, thi
2a050 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
2a060 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2a070 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2a080 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
2a090 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
2a0a0 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20  ing to plan. An 
2a0b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
2a0c0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
2a0d0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
2a0e0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2a0f0 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69  OsOpen() .** fai
2a100 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2a110 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
2a120 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2a130 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a140 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73  TE_OK;.  if( !is
2a150 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2a160 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
2a170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2a180 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2a190 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70  MODE_MEMORY || p
2a1a0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
2a1b0 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ory ){.      sql
2a1c0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70  ite3MemJournalOp
2a1d0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a1e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a1f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
2a200 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
2a210 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
2a220 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
2a230 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
2a240 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a250 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65  *.** Append a re
2a260 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72  cord of the curr
2a270 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67  ent state of pag
2a280 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62  e pPg to the sub
2a290 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a  -journal. .**.**
2a2a0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2a2b0 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
2a2c0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
2a2d0 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
2a2e0 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
2a2f0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
2a300 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
2a310 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
2a320 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
2a330 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
2a340 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2a350 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
2a360 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
2a370 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
2a380 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
2a390 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
2a3a0 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
2a3b0 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
2a3c0 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
2a3d0 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
2a3e0 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
2a3f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2a400 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
2a410 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
2a420 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a430 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2a440 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2a450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2a460 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
2a470 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2a480 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
2a490 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2a4a0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
2a4b0 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
2a4c0 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
2a4d0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2a4e0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
2a4f0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2a500 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
2a510 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
2a520 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2a530 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2a540 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
2a550 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
2a560 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
2a570 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
2a580 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
2a590 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70  ournal(pPager, p
2a5a0 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  Pg) .         ||
2a5b0 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
2a5c0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20  r->dbOrigSize . 
2a5d0 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f     );.    rc = o
2a5e0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50  penSubJournal(pP
2a5f0 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ager);..    /* I
2a600 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  f the sub-journa
2a610 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63  l was opened suc
2a620 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61  cessfully (or wa
2a630 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c  s already open),
2a640 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68  .    ** write th
2a650 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
2a660 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
2a670 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2a680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a690 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
2a6a0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
2a6b0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
2a6c0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75  (i64)pPager->nSu
2a6d0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
2a6e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
2a6f0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20   char *pData2;. 
2a700 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70   .      CODEC2(p
2a710 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
2a720 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
2a730 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
2a740 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20   pData2);.      
2a750 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d  PAGERTRACE(("STM
2a760 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
2a770 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2a780 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
2a790 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
2a7a0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
2a7b0 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
2a7c0 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
2a7d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a7e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a7f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2a800 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
2a810 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
2a820 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
2a830 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20  ffset+4);.      
2a840 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
2a850 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a860 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
2a870 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
2a880 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
2a890 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
2a8a0 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
2a8b0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2a8c0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2a8d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a8e0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ;.}.static int s
2a8f0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
2a900 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a 70  equired(PgHdr *p
2a910 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52  Pg){.  if( subjR
2a920 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
2a930 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
2a940 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
2a950 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
2a960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a970 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
2a980 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2a990 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
2a9a0 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
2a9b0 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
2a9c0 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
2a9d0 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
2a9e0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
2a9f0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2aa00 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
2aa10 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
2aa20 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
2aa30 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
2aa40 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
2aa50 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
2aa60 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
2aa70 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
2aa80 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
2aa90 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
2aaa0 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
2aab0 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
2aac0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
2aad0 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
2aae0 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
2aaf0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
2ab00 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
2ab10 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
2ab20 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
2ab30 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
2ab40 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
2ab50 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
2ab60 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
2ab70 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
2ab80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2ab90 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
2aba0 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
2abb0 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
2abc0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
2abd0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2abe0 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
2abf0 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
2ac00 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
2ac10 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
2ac20 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
2ac30 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2ac40 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
2ac50 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
2ac60 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
2ac70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2ac80 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
2ac90 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
2aca0 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
2acb0 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
2acc0 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
2acd0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
2ace0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2acf0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
2ad00 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2ad10 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
2ad20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2ad30 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
2ad40 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
2ad50 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
2ad60 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
2ad70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ad80 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
2ad90 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
2ada0 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
2adb0 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
2adc0 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
2add0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c  * The doNotSpill
2ade0 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73   NOSYNC bit is s
2adf0 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20  et during times 
2ae00 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e  when doing a syn
2ae10 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  c of.  ** journa
2ae20 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20  l (and adding a 
2ae30 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e  new header) is n
2ae40 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69  ot allowed.  Thi
2ae50 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  s occurs.  ** du
2ae60 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71  ring calls to sq
2ae70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2ae80 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  ) while trying t
2ae90 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70  o journal multip
2aea0 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65  le.  ** pages be
2aeb0 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73  longing to the s
2aec0 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a  ame sector..  **
2aed0 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53  .  ** The doNotS
2aee0 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e  pill ROLLBACK an
2aef0 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62  d OFF bits inhib
2af00 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70  its all cache sp
2af10 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61  illing.  ** rega
2af20 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2af30 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20  r or not a sync 
2af40 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68  is required.  Th
2af50 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67  is is set during
2af60 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b  .  ** a rollback
2af70 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71 75   or by user requ
2af80 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c  est, respectivel
2af90 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69  y..  **.  ** Spi
2afa0 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72  lling is also pr
2afb0 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e  ohibited when in
2afc0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
2afd0 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64  since that could
2afe0 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61  .  ** lead to da
2aff0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
2b000 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72  n.   In the curr
2b010 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
2b020 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69  on it .  ** is i
2b030 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71  mpossible for sq
2b040 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
2b050 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  () to be called 
2b060 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
2b070 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e  =3.  ** while in
2b080 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2b090 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d  , hence it is im
2b0a0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
2b0b0 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a  s routine to.  *
2b0c0 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74  * be called in t
2b0d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2b0e0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77   Nevertheless, w
2b0f0 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45  e include a NEVE
2b100 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f  R().  ** test fo
2b110 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2b120 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64  e as a safeguard
2b130 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20   against future 
2b140 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  changes..  */.  
2b150 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2b160 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2b170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b180 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
2b190 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
2b1a0 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
2b1b0 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  CK );.  testcase
2b1c0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b1d0 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b1e0 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61  _OFF );.  testca
2b1f0 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  se( pPager->doNo
2b200 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c  tSpill & SPILLFL
2b210 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69  AG_NOSYNC );.  i
2b220 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  f( pPager->doNot
2b230 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50  Spill.   && ((pP
2b240 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2b250 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f   & (SPILLFLAG_RO
2b260 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47  LLBACK|SPILLFLAG
2b270 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20  _OFF))!=0.      
2b280 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  || (pPg->flags &
2b290 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2b2a0 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72  )!=0).  ){.    r
2b2b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b2c0 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69  .  }..  pPg->pDi
2b2d0 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2b2e0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2b2f0 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
2b300 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
2b310 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
2b320 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
2b330 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2b340 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2b350 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20  (pPg); .    if( 
2b360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b370 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2b380 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
2b390 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20  r, pPg, 0, 0);. 
2b3a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2b3b0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2b3c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
2b3d0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2b3e0 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
2b3f0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2b400 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72   .     || pPager
2b410 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
2b420 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a  WRITER_CACHEMOD.
2b430 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
2b440 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
2b450 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  ager, 1);.    }.
2b460 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20    .    /* Write 
2b470 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2b480 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
2b490 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b4a0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
2b4b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b4c0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
2b4d0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
2b4e0 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a  EED_SYNC)==0 );.
2b4f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2b500 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2b510 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20  pPager, pPg);.  
2b520 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61    }.  }..  /* Ma
2b530 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
2b540 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72  lean. */.  if( r
2b550 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b560 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2b570 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65 20  "STRESS %d page 
2b580 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2b590 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2b5a0 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
2b5b0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2b5c0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
2b5d0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
2b5e0 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a  pPager, rc); .}.
2b5f0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2b600 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2b610 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
2b620 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
2b630 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
2b640 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
2b650 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
2b660 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
2b670 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
2b680 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2b690 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
2b6a0 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
2b6b0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
2b6c0 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
2b6d0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
2b6e0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
2b6f0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
2b700 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
2b710 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2b720 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
2b730 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
2b740 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
2b750 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
2b760 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
2b770 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
2b780 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
2b790 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
2b7a0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
2b7b0 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
2b7c0 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
2b7d0 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
2b7e0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
2b7f0 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
2b800 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
2b810 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
2b820 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
2b830 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
2b840 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
2b850 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
2b860 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2b870 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
2b880 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
2b890 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
2b8a0 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
2b8b0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2b8c0 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
2b8d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2b8e0 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
2b8f0 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
2b900 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
2b910 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
2b920 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
2b930 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
2b940 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
2b950 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
2b960 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
2b970 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
2b980 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73  he PAGER_* flags
2b990 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46  ..**.** The vfsF
2b9a0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69  lags parameter i
2b9b0 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70  s a bitmask to p
2b9c0 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73  ass to the flags
2b9d0 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66   parameter.** of
2b9e0 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74   the xOpen() met
2b9f0 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c  hod of the suppl
2ba00 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65  ied VFS when ope
2ba10 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a  ning files. .**.
2ba20 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
2ba30 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
2ba40 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63  ted and the spec
2ba50 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65  ified file opene
2ba60 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  d .** successful
2ba70 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ly, SQLITE_OK is
2ba80 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
2ba90 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f  pPager set to po
2baa0 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65  int to.** the ne
2bab0 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  w pager object. 
2bac0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2bad0 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20  rs, *ppPager is 
2bae0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61  set to NULL.** a
2baf0 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  nd error code re
2bb00 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e  turned. This fun
2bb10 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e  ction may return
2bb20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
2bb30 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28   (sqlite3Malloc(
2bb40 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c  ) is used to all
2bb50 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53  ocate memory), S
2bb60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f  QLITE_CANTOPEN o
2bb70 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51  r .** various SQ
2bb80 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f  LITE_IO_XXX erro
2bb90 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2bba0 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
2bbb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2bbc0 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
2bbd0 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
2bbe0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
2bbf0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
2bc00 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2bc10 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
2bc20 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2bc30 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2bc40 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
2bc50 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2bc60 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2bc70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
2bc80 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
2bc90 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
2bca0 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
2bcb0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2bcc0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2bcd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
2bce0 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
2bcf0 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2bd00 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20  int vfsFlags,   
2bd10 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2bd20 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
2bd30 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
2bd40 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69  xOpen() */.  voi
2bd50 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
2bd60 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f  age*) /* Functio
2bd70 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a  n to reinitializ
2bd80 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20  e pages */.){.  
2bd90 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65  u8 *pPtr;.  Page
2bda0 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20  r *pPager = 0;  
2bdb0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2bdc0 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ject to allocate
2bdd0 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2bde0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2bdf0 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74  _OK;      /* Ret
2be00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2be10 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20  t tempFile = 0; 
2be20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2be30 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69  or temp files (i
2be40 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  ncl. in-memory f
2be50 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d  iles) */.  int m
2be60 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  emDb = 0;       
2be70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2be80 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2be90 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ory file */.  in
2bea0 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2beb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2bec0 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2bed0 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2bee0 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2bef0 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2bf00 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2bf10 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2bf20 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2bf30 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2bf40 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2bf50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2bf60 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2bf70 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2bf80 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2bf90 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2bfa0 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2bfb0 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2bfc0 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2bfd0 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2bfe0 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2bff0 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2c000 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2c010 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2c020 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2c030 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2c040 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2c050 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2c060 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2c070 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2c080 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2c090 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2c0a0 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2c0b0 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2c0c0 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2c0d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c0e0 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2c0f0 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2c100 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2c110 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2c120 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2c130 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2c140 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2c150 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2c160 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2c170 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2c180 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
2c190 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
2c1a0 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
2c1b0 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
2c1c0 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
2c1d0 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
2c1e0 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
2c1f0 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
2c200 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
2c210 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
2c220 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
2c230 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
2c240 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
2c250 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
2c260 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
2c270 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
2c280 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
2c290 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2c2a0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
2c2b0 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
2c2c0 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
2c2d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
2c2e0 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
2c2f0 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
2c300 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
2c310 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2c320 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
2c330 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
2c340 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
2c350 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
2c360 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
2c370 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
2c380 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
2c390 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
2c3a0 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
2c3b0 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
2c3c0 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
2c3d0 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
2c3e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c3f0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69  MIT_MEMORYDB.  i
2c400 66 28 20 66 6c 61 67 73 20 26 20 50 41 47 45 52  f( flags & PAGER
2c410 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d  _MEMORY ){.    m
2c420 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66  emDb = 1;.    if
2c430 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2c440 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2c450 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d       zPathname =
2c460 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
2c470 28 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  (0, zFilename);.
2c480 20 20 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e        if( zPathn
2c490 61 6d 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e  ame==0  ) return
2c4a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c4b0 20 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d       nPathname =
2c4c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2c4d0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2c4e0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
2c4f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2c500 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  if..  /* Compute
2c510 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66   and store the f
2c520 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  ull pathname in 
2c530 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  an allocated buf
2c540 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a  fer pointed.  **
2c550 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65   to by zPathname
2c560 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61  , length nPathna
2c570 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20  me. Or, if this 
2c580 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2c590 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20  ile,.  ** leave 
2c5a0 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61  both nPathname a
2c5b0 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74  nd zPathname set
2c5c0 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66   to 0..  */.  if
2c5d0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2c5e0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2c5f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2c600 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  ;.    nPathname 
2c610 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
2c620 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
2c630 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ame = sqlite3DbM
2c640 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74  allocRaw(0, nPat
2c650 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
2c660 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
2c670 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2c680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2c690 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2c6a0 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2c6b0 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2c6c0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2c6d0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2c6e0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2c6f0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2c700 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2c710 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2c720 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2c730 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2c740 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2c750 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2c760 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2c770 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c780 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2c790 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2c7a0 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2c7b0 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2c7c0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2c7d0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2c7e0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2c7f0 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2c800 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2c810 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2c820 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c830 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2c840 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2c850 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2c860 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2c870 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2c880 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2c890 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2c8a0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2c8b0 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2c8c0 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2c8d0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2c8e0 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2c8f0 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2c900 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2c910 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2c920 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2c930 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2c940 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2c950 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2c960 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2c970 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2c980 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2c990 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2c9a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c9b0 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2c9c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2c9d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c9e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2c9f0 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2ca00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2ca10 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2ca20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2ca30 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2ca40 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2ca50 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2ca60 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2ca70 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2ca80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2ca90 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2caa0 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2cab0 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2cac0 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2cad0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2cae0 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2caf0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2cb00 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2cb10 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2cb20 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2cb30 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2cb40 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2cb50 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2cb60 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2cb70 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2cb80 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2cb90 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2cba0 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2cbb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2cbc0 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2cbd0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2cbe0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2cbf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2cc00 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2cc10 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2cc20 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2cc30 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2cc50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2cc60 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2cc70 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2cc80 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2cc90 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2cca0 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2ccb0 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2ccc0 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2ccd0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2cce0 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2ccf0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2cd00 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2cd10 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2cd20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2cd30 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2cd40 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2cd50 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2cd60 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2cd70 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2cd80 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2cd90 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2cda0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2cdb0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2cdc0 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2cdd0 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2cde0 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2cdf0 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2ce00 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2ce10 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2ce20 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2ce30 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2ce40 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2ce50 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2ce60 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2ce70 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2ce80 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2ce90 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2cea0 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2ceb0 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2cec0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2ced0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2cee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cef0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61  NOMEM;.  }.  pPa
2cf00 67 65 72 20 3d 20 20 20 20 20 20 20 20 20 20 20  ger =           
2cf10 20 20 20 28 50 61 67 65 72 2a 29 28 70 50 74 72     (Pager*)(pPtr
2cf20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43  );.  pPager->pPC
2cf30 61 63 68 65 20 3d 20 20 20 20 28 50 43 61 63 68  ache =    (PCach
2cf40 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2cf50 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2cf60 72 29 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r)));.  pPager->
2cf70 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
2cf80 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  file*)(pPtr += R
2cf90 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65  OUND8(pcacheSize
2cfa0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a  ));.  pPager->sj
2cfb0 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
2cfc0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
2cfd0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2cfe0 6c 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  le));.  pPager->
2cff0 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
2d000 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
2d010 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2d020 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
2d030 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
2d040 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
2d050 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73  lFileSize);.  as
2d060 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2d070 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65  _ALIGNMENT(pPage
2d080 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
2d090 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67   Fill in the Pag
2d0a0 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64  er.zFilename and
2d0b0 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20   Pager.zJournal 
2d0c0 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71 75  buffers, if requ
2d0d0 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a  ired. */.  if( z
2d0e0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2d0f0 61 73 73 65 72 74 28 20 6e 50 61 74 68 6e 61 6d  assert( nPathnam
2d100 65 3e 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  e>0 );.    pPage
2d110 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
2d120 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2d130 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20  nPathname + 1 + 
2d140 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2d150 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
2d160 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
2d170 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
2d180 69 66 28 20 6e 55 72 69 20 29 20 6d 65 6d 63 70  if( nUri ) memcp
2d190 79 28 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  y(&pPager->zFile
2d1a0 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
2d1b0 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a  ], zUri, nUri);.
2d1c0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2d1d0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61  r->zJournal, zPa
2d1e0 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2d1f0 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2d200 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d210 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
2d220 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32  ournal\000", 8+2
2d230 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  );.    sqlite3Fi
2d240 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65 72  leSuffix3(pPager
2d250 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61  ->zFilename, pPa
2d260 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
2d270 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d280 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70 50 61 67  MIT_WAL.    pPag
2d290 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67  er->zWal = &pPag
2d2a0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61  er->zJournal[nPa
2d2b0 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20  thname+8+1];.   
2d2c0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d2d0 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  zWal, zPathname,
2d2e0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2d2f0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d300 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  >zWal[nPathname]
2d310 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b  , "-wal\000", 4+
2d320 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  1);.    sqlite3F
2d330 69 6c 65 53 75 66 66 69 78 33 28 70 50 61 67 65  ileSuffix3(pPage
2d340 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2d350 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e  ager->zWal);.#en
2d360 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dif.    sqlite3D
2d370 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2d380 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
2d390 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
2d3a0 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
2d3b0 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
2d3c0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
2d3d0 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
2d3e0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2d3f0 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2d400 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d  {.    int fout =
2d410 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d420 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
2d430 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2d440 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72  xOpen() */.    r
2d450 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
2d460 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
2d470 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2d480 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c  r->fd, vfsFlags,
2d490 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 61 73 73   &fout);.    ass
2d4a0 65 72 74 28 20 21 6d 65 6d 44 62 20 29 3b 0a 20  ert( !memDb );. 
2d4b0 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66     readOnly = (f
2d4c0 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  out&SQLITE_OPEN_
2d4d0 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20  READONLY);..    
2d4e0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
2d4f0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
2d500 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f  opened for read/
2d510 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20  write access,.  
2d520 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
2d530 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2d540 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
2d550 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
2d560 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
2d570 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
2d580 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
2d590 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
2d5a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
2d5b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2d5c0 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a  AGE_SIZE,.    **
2d5d0 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20      + The value 
2d5e0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
2d5f0 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
2d600 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ).    **    + Th
2d610 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
2d620 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
2d630 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
2d640 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ly..    */.    i
2d650 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d660 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
2d670 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
2d680 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2d690 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
2d6a0 20 20 20 20 20 20 69 66 28 20 21 72 65 61 64 4f        if( !readO
2d6b0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nly ){.        s
2d6c0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
2d6d0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
2d6e0 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41  sert(SQLITE_DEFA
2d6f0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53  ULT_PAGE_SIZE<=S
2d700 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2d710 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20  T_PAGE_SIZE);.  
2d720 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
2d730 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63  Dflt<pPager->sec
2d740 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  torSize ){.     
2d750 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
2d760 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
2d770 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2d780 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
2d790 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2d7a0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lt = SQLITE_MAX_
2d7b0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2d7c0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
2d7d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2d7e0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 33  szPageDflt = (u3
2d7f0 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  2)pPager->sector
2d800 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2d810 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64  }.        }.#ifd
2d820 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2d830 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2d840 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2d850 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
2d860 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2d870 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
2d880 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20  2==(512>>8));.  
2d890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2d8a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2d8b0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
2d8c0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2d8d0 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
2d8e0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2d8f0 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
2d900 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61       for(ii=szPa
2d910 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49  geDflt; ii<=SQLI
2d920 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
2d930 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a  AGE_SIZE; ii=ii*
2d940 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2){.            
2d950 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f  if( iDc&(SQLITE_
2d960 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69  IOCAP_ATOMIC|(ii
2d970 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20  >>8)) ){.       
2d980 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
2d990 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
2d9a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d9b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
2d9c0 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
2d9d0 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
2d9e0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  = sqlite3_uri_bo
2d9f0 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  olean(zFilename,
2da00 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20   "nolock", 0);. 
2da10 20 20 20 20 20 69 66 28 20 28 69 44 63 20 26 20       if( (iDc & 
2da20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49 4d 4d  SQLITE_IOCAP_IMM
2da30 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20 20 20  UTABLE)!=0.     
2da40 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75 72 69    || sqlite3_uri
2da50 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61  _boolean(zFilena
2da60 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65 22 2c  me, "immutable",
2da70 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
2da80 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c   vfsFlags |= SQL
2da90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2daa0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  Y;.          got
2dab0 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f  o act_like_temp_
2dac0 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  file;.      }.  
2dad0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2dae0 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61   /* If a tempora
2daf0 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65  ry file is reque
2db00 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20  sted, it is not 
2db10 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  opened immediate
2db20 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  ly..    ** In th
2db30 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70  is case we accep
2db40 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  t the default pa
2db50 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61  ge size and dela
2db60 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a  y actually.    *
2db70 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69  * opening the fi
2db80 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  le until the fir
2db90 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69  st call to OsWri
2dba0 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  te()..    **.   
2dbb0 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2dbc0 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20  is also run for 
2dbd0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
2dbe0 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d  abase. An in-mem
2dbf0 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  ory.    ** datab
2dc00 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ase is the same 
2dc10 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74  as a temp-file t
2dc20 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69  hat is never wri
2dc30 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20  tten out to.    
2dc40 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73  ** disk and uses
2dc50 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f   an in-memory ro
2dc60 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
2dc70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2dc80 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f 20 72  is branch also r
2dc90 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20 6d 61  uns for files ma
2dca0 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61 62 6c  rked as immutabl
2dcb0 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74 5f 6c  e..    */ .act_l
2dcc0 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a 0a 20  ike_temp_file:. 
2dcd0 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
2dce0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
2dcf0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44  ate = PAGER_READ
2dd00 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65 74 65  ER;     /* Prete
2dd10 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  nd we already ha
2dd20 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  ve a lock */.   
2dd30 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
2dd40 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b   EXCLUSIVE_LOCK;
2dd50 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2dd60 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55 53 49  e are in EXCLUSI
2dd70 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 70  VE mode */.    p
2dd80 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20  Pager->noLock = 
2dd90 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
2dda0 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69    /* Do no locki
2ddb0 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64 4f 6e  ng */.    readOn
2ddc0 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
2ddd0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2dde0 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
2ddf0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
2de00 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
2de10 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
2de20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
2de30 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
2de40 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
2de50 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
2de60 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
2de70 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
2de80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2de90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2dea0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
2deb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2dec0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
2ded0 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
2dee0 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
2def0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
2df00 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
2df10 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
2df20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63  the PCache objec
2df30 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  t. */.  if( rc==
2df40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2df50 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c   assert( nExtra<
2df60 31 30 30 30 20 29 3b 0a 20 20 20 20 6e 45 78 74  1000 );.    nExt
2df70 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74  ra = ROUND8(nExt
2df80 72 61 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ra);.    rc = sq
2df90 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28  lite3PcacheOpen(
2dfa0 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74  szPageDflt, nExt
2dfb0 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20  ra, !memDb,.    
2dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dfd0 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53     !memDb?pagerS
2dfe0 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a  tress:0, (void *
2dff0 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  )pPager, pPager-
2e000 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
2e010 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2e020 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c   occurred above,
2e030 20 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72   free the  Pager
2e040 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
2e050 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20  lose the file.. 
2e060 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51   */.  if( rc!=SQ
2e070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2e080 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
2e090 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
2e0a0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
2e0b0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
2e0c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2e0d0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ree(pPager);.   
2e0e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2e0f0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2e100 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
2e110 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
2e120 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
2e130 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
2e140 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
2e150 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
2e160 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e170 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
2e180 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
2e190 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f  )useJournal;.  /
2e1a0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
2e1b0 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
2e1c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
2e1d0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2e1e0 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
2e1f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e200 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
2e210 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e220 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
2e230 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
2e240 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
2e250 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
2e260 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
2e270 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
2e280 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
2e290 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a  _UNLOCK; */.  /*
2e2a0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
2e2b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e2c0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
2e2d0 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
2e2e0 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
2e2f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e300 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
2e310 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
2e320 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
2e330 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
2e340 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
2e350 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2e360 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
2e370 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
2e380 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
2e390 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
2e3a0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2e3b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e3c0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
2e3d0 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
2e3e0 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
2e3f0 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
2e400 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65  y;.  assert( use
2e410 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65  Journal || pPage
2e420 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
2e430 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
2e440 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
2e450 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
2e460 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
2e470 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
2e480 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2e490 73 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  s = pPager->noSy
2e4a0 6e 63 20 3f 20 30 20 3a 20 53 51 4c 49 54 45 5f  nc ? 0 : SQLITE_
2e4b0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 70  SYNC_NORMAL;.  p
2e4c0 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
2e4d0 6c 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73  lags = pPager->s
2e4e0 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20  yncFlags;.  if( 
2e4f0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2e500 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2e510 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2e520 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2e530 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2e540 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2e550 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2e560 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2e570 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e580 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2e590 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2e5a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2e5b0 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2e5c0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2e5d0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
2e5e0 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
2e5f0 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
2e600 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
2e610 52 4d 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f  RMAL | WAL_SYNC_
2e620 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20  TRANSACTIONS;.  
2e630 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
2e640 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2e650 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2e660 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
2e670 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
2e680 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2e690 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
2e6a0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
2e6b0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
2e6c0 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75  ger->nExtra = (u
2e6d0 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61  16)nExtra;.  pPa
2e6e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
2e6f0 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
2e700 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
2e710 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
2e720 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2e730 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
2e740 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
2e750 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2e760 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61    if( !useJourna
2e770 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  l ){.    pPager-
2e780 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
2e790 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2e7a0 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _OFF;.  }else if
2e7b0 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
2e7c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2e7d0 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
2e7e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
2e7f0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
2e800 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
2e810 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e820 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
2e830 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  g = 0; */.  pPag
2e840 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
2e850 78 52 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65  xReinit;.  /* me
2e860 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
2e870 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
2e880 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
2e890 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
2e8a0 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
2e8b0 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
2e8c0 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
2e8d0 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
2e8e0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
2e8f0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
2e900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56  ITE_OK;.}.../* V
2e910 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
2e920 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2e930 20 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20   not be deleted 
2e940 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66  or renamed out f
2e950 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65  rom.** under the
2e960 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
2e970 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2e980 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 69   database is sti
2e990 6c 6c 20 77 65 72 65 20 69 74 20 6f 75 67 68 74  ll were it ought
2e9a0 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73  .** to be on dis
2e9b0 6b 2e 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a  k.  Return non-z
2e9c0 65 72 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44  ero (SQLITE_READ
2e9d0 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20  ONLY_DBMOVED or 
2e9e0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
2e9f0 0a 2a 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  .** code from sq
2ea00 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 29  lite3OsAccess())
2ea10 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ea20 20 68 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e   has gone missin
2ea30 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
2ea40 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
2ea50 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
2ea60 29 7b 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76  ){.  int bHasMov
2ea70 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ed = 0;.  int rc
2ea80 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
2ea90 3e 74 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75  >tempFile ) retu
2eaa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2eab0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
2eac0 7a 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ze==0 ) return S
2ead0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
2eae0 72 74 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  rt( pPager->zFil
2eaf0 65 6e 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d  ename && pPager-
2eb00 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b  >zFilename[0] );
2eb10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
2eb20 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61  sFileControl(pPa
2eb30 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
2eb40 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c  FCNTL_HAS_MOVED,
2eb50 20 26 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20   &bHasMoved);.  
2eb60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
2eb70 4f 54 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f  OTFOUND ){.    /
2eb80 2a 20 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56  * If the HAS_MOV
2eb90 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
2eba0 69 73 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64  is unimplemented
2ebb0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
2ebc0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61  e file.    ** ha
2ebd0 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64  s not been moved
2ebe0 2e 20 20 54 68 61 74 20 69 73 20 74 68 65 20 68  .  That is the h
2ebf0 69 73 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69  istorical behavi
2ec00 6f 72 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72  or of SQLite: pr
2ec10 69 6f 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65  ior to.    ** ve
2ec20 72 73 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20  rsion 3.8.3, it 
2ec30 6e 65 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f  never checked */
2ec40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2ec50 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
2ec60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2ec70 26 20 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20  & bHasMoved ){. 
2ec80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
2ec90 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b  EADONLY_DBMOVED;
2eca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2ecb0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
2ecc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ecd0 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
2ece0 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
2ecf0 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
2ed00 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
2ed10 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
2ed20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2ed30 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
2ed40 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
2ed50 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
2ed60 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
2ed70 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
2ed80 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
2ed90 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
2eda0 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
2edb0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
2edc0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
2edd0 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
2ede0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
2edf0 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
2ee00 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
2ee10 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
2ee20 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
2ee30 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
2ee40 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2ee50 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
2ee60 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
2ee70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2ee80 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
2ee90 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
2eea0 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
2eeb0 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
2eec0 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
2eed0 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
2eee0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2eef0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
2ef00 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
2ef10 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
2ef20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2ef30 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
2ef40 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
2ef50 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
2ef60 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
2ef70 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
2ef80 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
2ef90 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
2efa0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2efb0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
2efc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2efd0 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
2efe0 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
2eff0 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
2f000 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
2f010 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
2f020 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
2f030 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
2f040 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
2f050 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
2f060 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
2f070 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
2f080 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
2f090 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
2f0a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2f0b0 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
2f0c0 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
2f0d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f0e0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
2f0f0 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
2f100 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
2f110 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
2f120 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
2f130 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
2f140 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
2f150 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
2f160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f170 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
2f180 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
2f190 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
2f1a0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
2f1b0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2f1c0 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
2f1d0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2f1e0 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
2f1f0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2f200 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
2f210 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
2f220 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
2f230 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
2f240 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
2f250 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2f260 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
2f270 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
2f280 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2f290 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
2f2a0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2f2b0 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
2f2c0 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
2f2d0 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2f2e0 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
2f2f0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
2f300 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
2f310 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
2f320 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
2f330 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
2f340 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
2f350 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
2f360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2f370 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2f380 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2f390 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  /.  int exists =
2f3a0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
2f3b0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
2f3c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
2f3d0 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
2f3e0 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f  jrnlOpen = !!isO
2f3f0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2f400 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
2f410 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2f420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
2f430 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
2f440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2f450 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
2f460 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73  ER_OPEN );..  as
2f470 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d  sert( jrnlOpen==
2f480 30 20 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73  0 || ( sqlite3Os
2f490 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
2f4a0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66  stics(pPager->jf
2f4b0 64 29 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f  d) &.    SQLITE_
2f4c0 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c  IOCAP_UNDELETABL
2f4d0 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29  E_WHEN_OPEN.  ))
2f4e0 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20  ;..  *pExists = 
2f4f0 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70  0;.  if( !jrnlOp
2f500 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
2f510 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
2f520 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
2f530 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
2f540 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78  CESS_EXISTS, &ex
2f550 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ists);.  }.  if(
2f560 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2f570 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  & exists ){.    
2f580 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20  int locked = 0; 
2f590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f5a0 72 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63  rue if some proc
2f5b0 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45  ess holds a RESE
2f5c0 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20  RVED lock */..  
2f5d0 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74    /* Race condit
2f5e0 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68  ion here:  Anoth
2f5f0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
2f600 20 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69   have been holdi
2f610 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68  ng the.    ** th
2f620 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
2f630 61 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e  and have a journ
2f640 61 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73  al open at the s
2f650 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
2f660 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62   .    ** call ab
2f670 6f 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65  ove, but then de
2f680 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
2f690 20 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f   and drop the lo
2f6a0 63 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ck before.    **
2f6b0 20 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66   we get to the f
2f6c0 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
2f6d0 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
2f6e0 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20  ock() call.  If 
2f6f0 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
2f700 68 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f  he case, this ro
2f710 75 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e  utine might thin
2f720 6b 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  k there is a hot
2f730 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20   journal when.  
2f740 20 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65    ** in fact the
2f750 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69  re is none.  Thi
2f760 73 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66  s results in a f
2f770 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68  alse-positive wh
2f780 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ich will.    ** 
2f790 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
2f7a0 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f   the playback ro
2f7b0 75 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23  utine.  Ticket #
2f7c0 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  3883..    */.   
2f7d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43   rc = sqlite3OsC
2f7e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2f7f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f  (pPager->fd, &lo
2f800 63 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72  cked);.    if( r
2f810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2f820 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  !locked ){.     
2f830 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
2f840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f850 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2f860 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
2f870 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
2f880 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2f890 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
2f8a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f8b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f8c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2f8d0 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61  abase is zero pa
2f8e0 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61  ges in size, tha
2f8f0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74  t means that eit
2f900 68 65 72 20 28 31 29 20 74 68 65 0a 20 20 20 20  her (1) the.    
2f910 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69      ** journal i
2f920 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d  s a remnant from
2f930 20 61 20 70 72 69 6f 72 20 64 61 74 61 62 61 73   a prior databas
2f940 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
2f950 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20  name where.     
2f960 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2f970 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20  se file but not 
2f980 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
2f990 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20  deleted, or (2) 
2f9a0 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20  the initial.    
2f9b0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
2f9c0 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65  on that populate
2f9d0 73 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  s a new database
2f9e0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
2f9f0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
2fa00 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  * In either case
2fa10 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
2fa20 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  le can be delete
2fa30 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b  d.  However, tak
2fa40 65 20 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a  e care.        *
2fa50 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20  * not to delete 
2fa60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fa70 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
2fa80 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20  y open due to.  
2fa90 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
2faa0 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20  _mode=PERSIST.. 
2fab0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fac0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26    if( nPage==0 &
2fad0 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  & !jrnlOpen ){. 
2fae0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2faf0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
2fb00 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  c();.          i
2fb10 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70  f( pagerLockDb(p
2fb20 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f  Pager, RESERVED_
2fb30 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)==SQLITE_OK
2fb40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fb50 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
2fb60 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
2fb70 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
2fb80 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2fb90 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
2fba0 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b  de ) pagerUnlock
2fbb0 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  Db(pPager, SHARE
2fbc0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
2fbd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
2fbe0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
2fbf0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2fc00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fc10 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
2fc20 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
2fc30 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2fc40 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72  tion has a reser
2fc50 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ved.          **
2fc60 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2fc70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2fc80 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b   file. Now check
2fc90 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 20   that there is. 
2fca0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c           ** at l
2fcb0 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72  east one non-zer
2fcc0 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20 73  o bytes at the s
2fcd0 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2fce0 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
2fcf0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
2fd00 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73  is, then we cons
2fd10 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61  ider this journa
2fd20 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20  l to be hot. If 
2fd30 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  not, .          
2fd40 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e  ** it can be ign
2fd50 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20  ored..          
2fd60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2fd70 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20   !jrnlOpen ){.  
2fd80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
2fd90 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  = .#if SQLITE_EN
2fda0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
2fdb0 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  TION.           
2fdc0 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46     (pPager->vfsF
2fdd0 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2fde0 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f  _FILEPROTECTION_
2fdf0 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20  MASK)|.#endif.  
2fe00 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2fe10 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
2fe20 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2fe30 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
2fe40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fe50 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
2fe60 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2fe70 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
2fe80 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20  , &f);.         
2fe90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2fea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2feb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38  {.            u8
2fec0 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20   first = 0;.    
2fed0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fee0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
2fef0 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29  r->jfd, (void *)
2ff00 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20  &first, 1, 0);. 
2ff10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2ff20 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
2ff30 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2ff50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2ff60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ff70 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
2ff80 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
2ff90 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
2ffa0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
2ffb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2ffc0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
2ffd0 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
2ffe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2fff0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
30000 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
30010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
30020 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
30030 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
30040 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
30050 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
30060 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61          ** it ha
30070 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c  s a zero header,
30080 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64   that might be d
30090 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72  ue to an I/O err
300a0 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20  or, or.         
300b0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
300c0 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63  e due to the rac
300d0 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
300e0 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20  ribed above and 
300f0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  in.            *
30100 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20  * ticket #3883. 
30110 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73   Either way, ass
30120 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ume that the jou
30130 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20  rnal is hot..   
30140 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73           ** This
30150 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73   might be a fals
30160 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74  e positive.  But
30170 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   if it is, then 
30180 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
30190 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75  ** automatic jou
301a0 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e  rnal playback an
301b0 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61  d recovery mecha
301c0 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20  nism will deal. 
301d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69             ** wi
301e0 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45  th it under an E
301f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68  XCLUSIVE lock wh
30200 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  ere we do not ne
30210 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ed to.          
30220 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75    ** worry so mu
30230 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e  ch with race con
30240 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20  ditions..       
30250 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
30260 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
30270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
30280 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
30290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
302a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
302b0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
302c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
302d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
302e0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
302f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
30300 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30310 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65  e..** It is ille
30320 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  gal to call sqli
30330 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
30340 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  ) until after th
30350 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68  is function.** h
30360 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66  as been successf
30370 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20  ully called. If 
30380 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73  a shared-lock is
30390 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68   already held wh
303a0 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  en.** this funct
303b0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
303c0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
303d0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
303e0 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65  g operations are
303f0 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20   also performed 
30400 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
30410 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20  ..**.**   1) If 
30420 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
30430 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f  rently in PAGER_
30440 4f 50 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c  OPEN state (no l
30450 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20  ock held.**     
30460 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30470 20 66 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20   file), then an 
30480 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
30490 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20  to obtain a.**  
304a0 20 20 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20      SHARED lock 
304b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
304c0 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c  file. Immediatel
304d0 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
304e0 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48  g.**      the SH
304f0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66  ARED lock, the f
30500 69 6c 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68  ile-system is ch
30510 65 63 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d  ecked for a hot-
30520 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20  journal,.**     
30530 20 77 68 69 63 68 20 69 73 20 70 6c 61 79 65 64   which is played
30540 20 62 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74   back if present
30550 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20  . Following any 
30560 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  hot-journal .** 
30570 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74       rollback, t
30580 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
30590 68 65 20 63 61 63 68 65 20 61 72 65 20 76 61 6c  he cache are val
305a0 69 64 61 74 65 64 20 62 79 20 63 68 65 63 6b 69  idated by checki
305b0 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27  ng.**      the '
305c0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20  change-counter' 
305d0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74  field of the dat
305e0 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
305f0 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69  r and.**      di
30600 73 63 61 72 64 65 64 20 69 66 20 74 68 65 79 20  scarded if they 
30610 61 72 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  are found to be 
30620 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20  invalid..**.**  
30630 20 32 29 20 49 66 20 74 68 65 20 70 61 67 65 72   2) If the pager
30640 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
30650 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61  xclusive-mode, a
30660 6e 64 20 74 68 65 72 65 20 61 72 65 20 63 75 72  nd there are cur
30670 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e  rently.**      n
30680 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
30690 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20  ferences to any 
306a0 70 61 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e  pages, and is in
306b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
306c0 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61  ,.**      then a
306d0 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
306e0 65 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65  e to clear the e
306f0 72 72 6f 72 20 73 74 61 74 65 20 62 79 20 64 69  rror state by di
30700 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20  scarding.**     
30710 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30720 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
30730 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  and rolling back
30740 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   any open journa
30750 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a  l.**      file..
30760 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
30770 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
30780 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
30790 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
307a0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
307b0 75 72 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e  urs while lockin
307c0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
307d0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68  checking for a h
307e0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
307f0 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62  or .** rolling b
30800 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ack a journal fi
30810 6c 65 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  le, the IO error
30820 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
30830 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
30840 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
30850 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30860 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30870 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
30880 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30890 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
308a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
308b0 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  ly called from b
308c0 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77  -tree and only w
308d0 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
308e0 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  .  ** outstandin
308f0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d  g pages. This im
30900 70 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 70  plies that the p
30910 61 67 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c  ager state shoul
30920 64 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65  d either.  ** be
30930 20 4f 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e   OPEN or READER.
30940 20 52 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20   READER is only 
30950 70 6f 73 73 69 62 6c 65 20 69 66 20 74 68 65 20  possible if the 
30960 70 61 67 65 72 20 69 73 20 6f 72 20 77 61 73 20  pager is or was 
30970 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69  in .  ** exclusi
30980 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
30990 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
309a0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
309b0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
309c0 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ache)==0 );.  as
309d0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
309e0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
309f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
30a00 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30a10 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
30a20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
30a30 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 69 66  R_READER );.  if
30a40 28 20 4e 45 56 45 52 28 4d 45 4d 44 42 20 26 26  ( NEVER(MEMDB &&
30a50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
30a60 29 20 29 7b 20 72 65 74 75 72 6e 20 70 50 61 67  ) ){ return pPag
30a70 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20 7d 0a 0a  er->errCode; }..
30a80 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
30a90 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
30aa0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
30ab0 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20  GER_OPEN ){.    
30ac0 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20  int bHotJournal 
30ad0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
30ae0 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65   True if there e
30af0 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72  xists a hot jour
30b00 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  nal-file */..   
30b10 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
30b20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  );..    rc = pag
30b30 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
30b40 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
30b50 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  OCK);.    if( rc
30b60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30b70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
30b80 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
30b90 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  OCK || pPager->e
30ba0 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
30bb0 43 4b 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  CK );.      goto
30bc0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a   failed;.    }..
30bd0 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
30be0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
30bf0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
30c00 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
30c10 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
30c20 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
30c30 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
30c40 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
30c50 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
30c60 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
30c70 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41  ager->eLock<=SHA
30c80 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
30c90 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75    rc = hasHotJou
30ca0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48  rnal(pPager, &bH
30cb0 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
30cc0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
30cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30ce0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
30cf0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74    }.    if( bHot
30d00 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
30d10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
30d20 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
30d30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
30d40 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  DONLY_ROLLBACK;.
30d50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
30d60 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  led;.      }..  
30d70 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
30d80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
30d90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30da0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
30db0 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   it is.      ** 
30dc0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
30dd0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
30de0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
30df0 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
30e00 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  .      ** EXCLUS
30e10 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
30e20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
30e30 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
30e40 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
30e50 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
30e60 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
30e70 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
30e80 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
30e90 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
30ea0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
30eb0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
30ec0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
30ed0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ng the .      **
30ee0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63   hot-journal bac
30ef0 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
30f00 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
30f10 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
30f20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
30f30 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61  not requested, a
30f40 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  ny.      ** othe
30f50 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70  r process attemp
30f60 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74  ting to access t
30f70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30f80 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20   will get to .  
30f90 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e      ** this poin
30fa0 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
30fb0 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e  d fail to obtain
30fc0 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49   its own EXCLUSI
30fd0 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a  VE lock .      *
30fe0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
30ff0 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  e file..      **
31000 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73  .      ** Unless
31010 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
31020 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
31030 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
31040 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20  e lock is.      
31050 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
31060 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66   SHARED_LOCK bef
31070 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
31080 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20  n returns..     
31090 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70   */.      rc = p
310a0 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
310b0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
310c0 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
310d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
310e0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
310f0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20  ed;.      }. .  
31100 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
31110 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
31120 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78   and the file ex
31130 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70  ists on disk, op
31140 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  en the .      **
31150 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
31160 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
31170 57 72 69 74 65 20 61 63 63 65 73 73 20 69 73 20  Write access is 
31180 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
31190 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78   .      ** in ex
311a0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
311b0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
311c0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
311d0 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20  kept open .     
311e0 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79   ** and possibly
311f0 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e   used for a tran
31200 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e  saction later on
31210 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63  . Also, write-ac
31220 63 65 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  cess .      ** i
31230 73 20 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72  s usually requir
31240 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  ed to finalize t
31250 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f  he journal in jo
31260 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69  urnal_mode=persi
31270 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64  st .      ** mod
31280 65 20 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20  e (and also for 
31290 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75  journal_mode=tru
312a0 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79  ncate on some sy
312b0 73 74 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a  stems)..      **
312c0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
312d0 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
312e0 74 20 65 78 69 73 74 2c 20 69 74 20 75 73 75 61  t exist, it usua
312f0 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73  lly means that s
31300 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74  ome .      ** ot
31310 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  her connection m
31320 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e  anaged to get in
31330 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63   and roll it bac
31340 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20  k before .      
31350 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  ** this connecti
31360 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  on obtained the 
31370 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
31380 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20  bove. Or, it .  
31390 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20      ** may mean 
313a0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
313b0 61 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d  as in the error-
313c0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
313d0 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
313e0 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64  n was called and
313f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31400 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
31410 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
31420 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
31430 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
31440 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
31450 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
31460 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
31470 20 20 20 20 20 20 69 6e 74 20 62 45 78 69 73 74        int bExist
31480 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
31490 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
314a0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a  al file exists *
314b0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
314c0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
314d0 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73              pVfs
314e0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
314f0 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
31500 53 5f 45 58 49 53 54 53 2c 20 26 62 45 78 69 73  S_EXISTS, &bExis
31510 74 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ts);.        if(
31520 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
31530 26 20 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20  & bExists ){.   
31540 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
31550 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
31560 6e 74 20 66 20 3d 20 0a 23 69 66 20 53 51 4c 49  nt f = .#if SQLI
31570 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
31580 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20  ROTECTION.      
31590 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76        (pPager->v
315a0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
315b0 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49  PEN_FILEPROTECTI
315c0 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66  ON_MASK)|.#endif
315d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
315e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
315f0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
31600 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
31610 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
31620 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31630 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
31640 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
31650 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31660 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
31670 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
31680 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31690 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
316a0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
316b0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
316c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
316d0 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
316e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
316f0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
31700 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31710 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
31720 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31730 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
31740 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
31750 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31760 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31770 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
31780 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
31790 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
317a0 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
317b0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
317c0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
317d0 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
317e0 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
317f0 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
31800 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
31810 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
31820 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
31830 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
31840 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
31850 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
31860 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
31870 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
31880 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
31890 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
318a0 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
318b0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
318c0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
318d0 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
318e0 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
318f0 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
31900 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
31910 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
31920 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
31930 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31940 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
31950 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
31960 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31970 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
31980 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
31990 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
319a0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
319b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
319c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
319d0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
319e0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
319f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
31a00 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
31a10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31a20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
31a30 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31a40 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  de ){.        pa
31a50 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
31a60 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
31a70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31a80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31a90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31aa0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
31ab0 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f  taken if an erro
31ac0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
31ad0 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20  rying to open.  
31ae0 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c        ** or roll
31af0 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
31b00 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  nal while holdin
31b10 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
31b20 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ock. The.       
31b30 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   ** pager_unlock
31b40 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
31b50 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
31b60 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e   returning to un
31b70 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  lock.        ** 
31b80 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
31b90 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20   unlock attempt 
31ba0 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65  fails, then Page
31bb0 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a  r.eLock must be.
31bc0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
31bd0 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28  o UNKNOWN_LOCK (
31be0 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
31bf0 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
31c00 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  e for .        *
31c10 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61  * UNKNOWN_LOCK a
31c20 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c  bove for an expl
31c30 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20  anation). .     
31c40 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31c50 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   In order to get
31c60 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31c70 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20  to do this, set 
31c80 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a  Pager.eState to.
31c90 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52          ** PAGER
31ca0 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73  _ERROR now. This
31cb0 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
31cc0 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72   counted as a tr
31cd0 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  ansition.       
31ce0 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61   ** to ERROR sta
31cf0 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  te in the state 
31d00 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74  diagram at the t
31d10 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c  op of this file,
31d20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63  .        ** sinc
31d30 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  e we know that t
31d40 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20  he same call to 
31d50 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
31d60 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20  ill very.       
31d70 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e   ** shortly tran
31d80 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72  sition the pager
31d90 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f   object to the O
31da0 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69  PEN state. Calli
31db0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ng.        ** as
31dc0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31dd0 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f  () would fail no
31de0 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20  w, as it should 
31df0 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
31e00 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
31e10 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
31e20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a  when there are z
31e30 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ero outstanding 
31e40 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
31e50 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20   references..   
31e60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31e70 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
31e80 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
31e90 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31ea0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
31eb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
31ec0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
31ed0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31ee0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
31ef0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
31f00 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
31f10 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31f20 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  de && pPager->eL
31f30 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
31f40 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
31f50 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
31f60 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50  ->tempFile && pP
31f70 61 67 65 72 2d 3e 68 61 73 42 65 65 6e 55 73 65  ager->hasBeenUse
31f80 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  d ){.      /* Th
31f90 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
31fa0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
31fb0 69 72 65 64 20 74 68 65 6e 20 63 68 65 63 6b 20  ired then check 
31fc0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 20  to.      ** see 
31fd0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
31fe0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
31ff0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
32000 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
32010 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73 68 20  .      ** flush 
32020 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 20  the cache.  The 
32030 70 50 61 67 65 72 2d 3e 68 61 73 42 65 65 6e 55  pPager->hasBeenU
32040 73 65 64 20 66 6c 61 67 20 70 72 65 76 65 6e 74  sed flag prevent
32050 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  s this from.    
32060 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f    ** occurring o
32070 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  n the very first
32080 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c   access to a fil
32090 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  e, in order to s
320a0 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ave a.      ** s
320b0 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72  ingle unnecessar
320c0 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  y sqlite3OsRead(
320d0 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74  ) call at the st
320e0 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a  art-up..      **
320f0 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
32100 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64  se changes are d
32110 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
32120 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
32130 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
32140 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
32150 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
32160 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
32170 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
32180 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
32190 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
321a0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
321b0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
321c0 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
321d0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
321e0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
321f0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
32200 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
32210 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
32220 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
32230 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
32240 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
32250 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
32260 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
32270 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
32280 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
32290 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
322a0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
322b0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
322c0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
322d0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
322e0 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50  */.      Pgno nP
322f0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  age = 0;.      c
32300 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
32310 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
32320 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20  FileVers)];..   
32330 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
32340 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
32350 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
32360 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69 6c  ( rc ) goto fail
32370 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  ed;..      if( n
32380 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Page>0 ){.      
32390 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
323a0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
323b0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
323c0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
323d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
323e0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
323f0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
32400 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32410 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
32420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32430 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
32440 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
32450 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
32460 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
32470 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
32480 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
32490 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
324a0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
324b0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
324c0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
324d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
324e0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
324f0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
32500 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
32510 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
32520 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ger);..        /
32530 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61  * Unmap the data
32540 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73  base file. It is
32550 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65   possible that e
32560 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
32570 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  s.        ** may
32580 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20   have truncated 
32590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
325a0 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e  e and then exten
325b0 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20  ded it back.    
325c0 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72      ** to its or
325d0 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c  iginal size whil
325e0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77  e this process w
325f0 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  as not holding a
32600 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
32610 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
32620 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61  here may exist a
32630 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70   Pager.pMap mapp
32640 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
32650 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
32660 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  e the right size
32670 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75   but is not actu
32680 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69  ally valid. Avoi
32690 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  d this.        *
326a0 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79  * possibility by
326b0 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64   unmapping the d
326c0 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  b here. */.     
326d0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
326e0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
326f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
32700 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
32710 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
32720 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
32730 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
32740 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
32750 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
32760 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
32770 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
32780 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
32790 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
327a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
327b0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
327c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
327d0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
327e0 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ent(pPager);.#if
327f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32800 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28  _WAL.    assert(
32810 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
32820 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
32830 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  K );.#endif.  }.
32840 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
32850 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
32860 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
32870 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
32880 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
32890 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
328a0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
328b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
328c0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  ==PAGER_OPEN && 
328d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
328e0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50  .    rc = pagerP
328f0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
32900 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   &pPager->dbSize
32910 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a  );.  }.. failed:
32920 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
32930 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
32940 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
32950 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
32960 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
32970 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32980 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
32990 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
329a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
329b0 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20  PAGER_READER;.  
329c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
329d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
329e0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
329f0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
32a00 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
32a10 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
32a20 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
32a30 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
32a40 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
32a50 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
32a60 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
32a70 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
32a80 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
32a90 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
32aa0 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
32ab0 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
32ac0 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
32ad0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
32ae0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
32af0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
32b00 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
32b10 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
32b20 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
32b30 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d  ager->nMmapOut==
32b40 30 20 26 26 20 28 73 71 6c 69 74 65 33 50 63 61  0 && (sqlite3Pca
32b50 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
32b60 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
32b70 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
32b80 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
32b90 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
32ba0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
32bb0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
32bc0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
32bd0 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61 20  pager pPager (a 
32be0 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  page.** referenc
32bf0 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61 67  e has type DbPag
32c00 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71 75  e*). If the requ
32c10 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65 20  ested reference 
32c20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  is .** successfu
32c30 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74  lly obtained, it
32c40 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70   is copied to *p
32c50 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45  pPage and SQLITE
32c60 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
32c70 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
32c80 73 74 65 64 20 70 61 67 65 20 69 73 20 61 6c 72  sted page is alr
32c90 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
32ca0 65 2c 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  e, it is returne
32cb0 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
32cc0 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  , a new page obj
32cd0 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ect is allocated
32ce0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
32cf0 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64  ith data.** read
32d00 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
32d10 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65  se file. In some
32d20 20 63 61 73 65 73 2c 20 74 68 65 20 70 63 61 63   cases, the pcac
32d30 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a  he module may.**
32d40 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61   choose not to a
32d50 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
32d60 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61  ge object and ma
32d70 79 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  y reuse an exist
32d80 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69  ing.** object wi
32d90 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  th no outstandin
32da0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  g references..**
32db0 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20 64 61  .** The extra da
32dc0 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
32dd0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
32de0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
32df0 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72  eros the .** fir
32e00 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
32e10 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
32e20 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70 61 67  mory. If the pag
32e30 65 20 72 65 71 75 65 73 74 65 64 20 69 73 20 0a  e requested is .
32e40 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
32e50 65 20 63 61 63 68 65 20 77 68 65 6e 20 74 68 69  e cache when thi
32e60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
32e70 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65  lled, then the e
32e80 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20  xtra.** data is 
32e90 6c 65 66 74 20 61 73 20 69 74 20 77 61 73 20 77  left as it was w
32ea0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a  hen the page obj
32eb0 65 63 74 20 77 61 73 20 6c 61 73 74 20 75 73 65  ect was last use
32ec0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
32ed0 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 69  database image i
32ee0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
32ef0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
32f00 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f  e or if a .** no
32f10 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20  n-zero value is 
32f20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f  passed as the no
32f30 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65  Content paramete
32f40 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65  r and the .** re
32f50 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
32f60 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72  not already stor
32f70 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  ed in the cache,
32f80 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74   then no .** act
32f90 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63  ual disk read oc
32fa0 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  curs. In this ca
32fb0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  se the memory im
32fc0 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  age of the .** p
32fd0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
32fe0 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e  ed to all zeros.
32ff0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e   .**.** If noCon
33000 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
33010 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
33020 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
33030 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
33040 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68   of the page. Th
33050 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f  is occurs in two
33060 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a   scenarios:.**.*
33070 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64  *   a) When read
33080 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ing a free-list 
33090 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74  leaf page from t
330a0 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  he database, and
330b0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e  .**.**   b) When
330c0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
330d0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
330e0 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  k and we need to
330f0 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20   load.**      a 
33100 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  new page into th
33110 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69  e cache to be fi
33120 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
33130 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ta read.**      
33140 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69  from the savepoi
33150 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
33160 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
33170 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
33180 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20 69   data returned i
33190 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61 64  s zeroed instead
331a0 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61   of.** being rea
331b0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
331c0 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ase. Additionall
331d0 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72 72  y, the bits corr
331e0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
331f0 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70 49  pgno in Pager.pI
33200 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65 63  nJournal (bitvec
33210 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
33220 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
33230 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
33240 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  ) and the PagerS
33250 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
33260 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f 66  point bitvecs of
33270 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61 76   any open.** sav
33280 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74 2e  epoints are set.
33290 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 74   This means if t
332a0 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65 20  he page is made 
332b0 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79 0a  writable at any.
332c0 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ** point in the 
332d0 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61 20  future, using a 
332e0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
332f0 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74 73  agerWrite(), its
33300 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69 6c   contents.** wil
33310 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61 6c  l not be journal
33320 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20 49  ed. This saves I
33330 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  O..**.** The acq
33340 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
33350 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
33360 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
33370 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
33380 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
33390 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
333a0 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
333b0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
333c0 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
333d0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
333e0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
333f0 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28  tine and Lookup(
33400 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  ) attempt.** to 
33410 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
33420 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
33430 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68  he first.  If th
33440 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
33450 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  ready.** in memo
33460 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ry, this routine
33470 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f   goes to disk to
33480 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72   read it in wher
33490 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  eas Lookup().** 
334a0 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
334b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
334c0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
334d0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
334e0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
334f0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
33500 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
33510 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
33520 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
33530 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28  ** Since Lookup(
33540 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
33550 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
33560 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
33570 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
33580 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
33590 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
335a0 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
335b0 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
335c0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
335d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
335e0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
335f0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
33600 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
33610 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
33620 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
33630 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
33640 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
33650 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
33660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
33670 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
33680 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
33690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
336a0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
336b0 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
336c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
336d0 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65    /* Frame to re
336e0 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  ad from WAL file
336f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
33700 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61  noContent = (fla
33710 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 4e  gs & PAGER_GET_N
33720 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20 20 2f 2a  OCONTENT);..  /*
33730 20 49 74 20 69 73 20 61 63 63 65 70 74 61 62 6c   It is acceptabl
33740 65 20 74 6f 20 75 73 65 20 61 20 72 65 61 64 2d  e to use a read-
33750 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70 61 67 65  only (mmap) page
33760 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 65 78   for any page ex
33770 63 65 70 74 0a 20 20 2a 2a 20 70 61 67 65 20 31  cept.  ** page 1
33780 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
33790 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
337a0 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65 20 41 43  n open or the AC
337b0 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 0a 20  QUIRE_READONLY. 
337c0 20 2a 2a 20 66 6c 61 67 20 77 61 73 20 73 70 65   ** flag was spe
337d0 63 69 66 69 65 64 20 62 79 20 74 68 65 20 63 61  cified by the ca
337e0 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e  ller. And so lon
337f0 67 20 61 73 20 74 68 65 20 64 62 20 69 73 20 6e  g as the db is n
33800 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65 6d 70 6f  ot a .  ** tempo
33810 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72  rary or in-memor
33820 79 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  y database.  */.
33830 20 20 63 6f 6e 73 74 20 69 6e 74 20 62 4d 6d 61    const int bMma
33840 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d 31 20 26  pOk = (pgno!=1 &
33850 26 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65  & USEFETCH(pPage
33860 72 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  r).   && (pPager
33870 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
33880 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67 73  READER || (flags
33890 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   & PAGER_GET_REA
338a0 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66 20 53  DONLY)).#ifdef S
338b0 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
338c0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78 43     && pPager->xC
338d0 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20  odec==0.#endif. 
338e0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
338f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
33900 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
33910 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
33920 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
33930 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
33940 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c 7c   noContent==0 ||
33950 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a 0a   bMmapOk==0 );..
33960 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
33970 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
33980 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33990 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 68  .  }.  pPager->h
339a0 61 73 42 65 65 6e 55 73 65 64 20 3d 20 31 3b 0a  asBeenUsed = 1;.
339b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
339c0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
339d0 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
339e0 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69   an error immedi
339f0 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68  ately. .  ** Oth
33a00 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74 20  erwise, request 
33a10 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
33a20 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20  e PCache layer. 
33a30 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
33a40 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
33a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
33a60 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
33a70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
33a80 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67  ( bMmapOk && pag
33a90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33aa0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
33ab0 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
33ac0 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
33ad0 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b   pgno, &iFrame);
33ae0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
33af0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
33b00 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
33b10 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
33b20 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72  ( bMmapOk && iFr
33b30 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
33b40 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
33b50 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
33b60 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67  ite3OsFetch(pPag
33b70 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
33b80 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29     (i64)(pgno-1)
33b90 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
33ba0 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ize, pPager->pag
33bb0 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20  eSize, &pData.  
33bc0 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
33bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33be0 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  && pData ){.    
33bf0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
33c00 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41  eState>PAGER_REA
33c10 44 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  DER ){.         
33c20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
33c30 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
33c40 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
33c50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
33c60 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Pg==0 ){.       
33c70 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
33c80 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
33c90 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c  er, pgno, pData,
33ca0 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
33cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
33cc0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
33cd0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
33ce0 36 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67  64)(pgno-1)*pPag
33cf0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44  er->pageSize, pD
33d00 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata);.        }.
33d10 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 20          if( pPg 
33d20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
33d30 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
33d40 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OK );.          
33d50 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
33d60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
33d70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
33d80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
33d90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33db0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
33dc0 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
33dd0 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20      }..    {.   
33de0 20 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68     sqlite3_pcach
33df0 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20  e_page *pBase;. 
33e00 20 20 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c       pBase = sql
33e10 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
33e20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
33e30 20 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20   pgno, 3);.     
33e40 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
33e50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
33e60 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
33e70 53 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70  Stress(pPager->p
33e80 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70  PCache, pgno, &p
33e90 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Base);.        i
33ea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
33eb0 20 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63   ) goto pager_ac
33ec0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
33ed0 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20     if( pBase==0 
33ee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
33ef0 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a   = *ppPage = 0;.
33f00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
33f10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
33f20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
33f30 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
33f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33f50 0a 20 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70  .      pPg = *pp
33f60 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Page = sqlite3Pc
33f70 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28  acheFetchFinish(
33f80 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
33f90 20 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20   pgno, pBase);. 
33fa0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
33fb0 21 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  !=0 );.    }.  }
33fc0 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
33fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
33fe0 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20  Either the call 
33ff0 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  to sqlite3Pcache
34000 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65 64  Fetch() returned
34010 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65   an error or the
34020 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61  .    ** pager wa
34030 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
34040 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65   error-state whe
34050 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
34060 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
34070 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30 20  ** Set pPg to 0 
34080 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  and jump to the 
34090 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65  exception handle
340a0 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  r.  */.    pPg =
340b0 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67   0;.    goto pag
340c0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
340d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
340e0 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a  g==(*ppPage) );.
340f0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34100 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
34110 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
34120 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50  er==pPager || pP
34130 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  g->pPager==0 );.
34140 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67  .  if( pPg->pPag
34150 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
34160 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
34170 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
34180 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
34190 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
341a0 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
341b0 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
341c0 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
341d0 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
341e0 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
341f0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
34200 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
34210 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
34220 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
34230 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
34240 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
34250 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
34260 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
34270 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
34280 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
34290 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
342a0 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
342b0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
342c0 20 2a 2f 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50   */..    pPg->pP
342d0 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a  ager = pPager;..
342e0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d      /* The maxim
342f0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
34300 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
34310 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
34320 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e   a page.    ** n
34330 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
34340 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20  an this, or the 
34350 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70  unused locking-p
34360 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74 65  age, is requeste
34370 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  d. */.    if( pg
34380 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
34390 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  O || pgno==PAGER
343a0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
343b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
343c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
343d0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
343e0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
343f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
34400 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72   MEMDB || pPager
34410 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c  ->dbSize<pgno ||
34420 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69   noContent || !i
34430 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
34440 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
34450 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
34460 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
34470 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
34480 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
34490 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
344a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
344b0 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
344c0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
344d0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
344e0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
344f0 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
34500 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
34510 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
34520 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
34530 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
34540 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
34550 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
34560 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
34570 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
34580 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
34590 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
345a0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
345b0 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
345c0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
345d0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
345e0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
345f0 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
34600 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
34610 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34620 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
34630 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
34640 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
34650 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
34660 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
34670 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
34680 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
34690 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
346a0 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
346b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
346c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
346d0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
346e0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
346f0 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
34700 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
34710 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
34720 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
34730 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34740 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
34750 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
34760 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
34770 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
34780 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
34790 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
347a0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
347b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
347c0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
347d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
347e0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
347f0 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d  er) && bMmapOk==
34800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
34810 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
34820 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
34830 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
34840 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
34850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
34860 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34870 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
34890 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
348a0 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  r );.      pPage
348b0 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
348c0 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20  TAT_MISS]++;.   
348d0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
348e0 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b  ge(pPg, iFrame);
348f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34910 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34920 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
34940 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
34950 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
34960 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34970 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65  .pager_acquire_e
34980 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63  rr:.  assert( rc
34990 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
349a0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
349b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
349c0 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61  p(pPg);.  }.  pa
349d0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
349e0 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70  d(pPager);..  *p
349f0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
34a00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34a10 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
34a20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
34a30 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
34a40 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
34a50 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
34a60 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
34a70 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
34a80 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
34a90 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
34aa0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
34ab0 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f   .**.** See also
34ac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
34ad0 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
34ae0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
34af0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
34b00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
34b10 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
34b20 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
34b30 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
34b40 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
34b50 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
34b60 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
34b70 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
34b80 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
34b90 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
34ba0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
34bb0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
34bc0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
34bd0 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
34be0 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
34bf0 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
34c00 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
34c10 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61  ){.  sqlite3_pca
34c20 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b  che_page *pPage;
34c30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34c40 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
34c50 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
34c60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
34c70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70  PCache!=0 );.  p
34c80 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Page = sqlite3Pc
34c90 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
34ca0 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34cb0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
34cc0 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Page==0 || pPage
34cd0 72 2d 3e 68 61 73 42 65 65 6e 55 73 65 64 20 29  r->hasBeenUsed )
34ce0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  ;.  if( pPage==0
34cf0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
34d00 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
34d10 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70  cheFetchFinish(p
34d20 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34d30 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a 7d 0a  pgno, pPage);.}.
34d40 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
34d50 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
34d60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
34d70 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
34d80 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
34d90 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
34da0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
34db0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
34dc0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
34dd0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
34de0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
34df0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
34e00 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
34e10 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
34e20 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
34e30 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
34e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
34e50 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65  efNotNull(DbPage
34e60 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
34e70 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72  *pPager;.  asser
34e80 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 70  t( pPg!=0 );.  p
34e90 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
34ea0 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
34eb0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
34ec0 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65 72 52  AP ){.    pagerR
34ed0 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50  eleaseMapPage(pP
34ee0 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
34ef0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
34f00 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a  lease(pPg);.  }.
34f10 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
34f20 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
34f30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
34f40 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
34f50 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
34f60 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
34f70 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
34f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
34f90 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
34fa0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
34fb0 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
34fc0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
34fd0 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
34fe0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
34ff0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
35000 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
35010 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
35020 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
35030 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
35040 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
35050 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
35060 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
35070 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
35080 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
35090 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
350a0 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
350b0 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
350c0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
350d0 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
350e0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
350f0 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
35100 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
35110 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
35120 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
35130 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
35140 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
35150 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
35160 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
35170 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
35180 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
35190 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
351a0 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
351b0 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
351c0 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
351d0 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
351e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
351f0 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
35200 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
35210 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
35220 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
35230 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
35240 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
35250 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
35260 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
35270 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
35280 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
35290 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
352a0 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
352b0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
352c0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
352d0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
352e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
352f0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
35300 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
35310 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
35320 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
35330 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
35340 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
35350 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
35360 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
35370 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
35380 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
35390 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
353a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
353b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
353c0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
353d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
353e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
353f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
35400 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
35410 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
35420 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
35430 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
35440 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
35450 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
35460 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
35470 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
35480 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
35490 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
354a0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
354b0 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
354c0 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
354d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
354e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
354f0 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
35500 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
35510 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
35520 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
35530 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
35540 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
35550 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
35560 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
35570 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
35580 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
35590 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
355a0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
355b0 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
355c0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
355d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
355e0 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
355f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
35600 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
35610 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
35620 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
35630 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
35640 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
35650 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
35660 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f     }.  .    /* O
35670 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
35680 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
35690 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
356a0 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  */.    if( !isOp
356b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
356c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
356d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
356e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
356f0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
35700 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
35710 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
35720 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
35730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
35740 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
35750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35760 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20     /* VFS flags 
35770 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  to open journal 
35780 66 69 6c 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49  file */.#if SQLI
35790 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
357a0 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20  ROTECTION.      
357b0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73      (pPager->vfs
357c0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
357d0 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e  N_FILEPROTECTION
357e0 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20  _MASK)|.#endif. 
357f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35800 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
35810 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
35820 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  E|.          (pP
35830 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f  ager->tempFile ?
35840 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53   .            (S
35850 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
35860 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
35870 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
35880 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  L):.            
35890 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  (SQLITE_OPEN_MAI
358a0 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20  N_JOURNAL).     
358b0 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 20       );..       
358c0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
358d0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69  the database sti
358e0 6c 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ll has the same 
358f0 6e 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77  name as it did w
35900 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hen.        ** i
35910 74 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79  t was originally
35920 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
35930 20 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73      rc = databas
35940 65 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65  eIsUnmoved(pPage
35950 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
35960 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
35970 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
35980 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
35990 54 45 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  TE.          rc 
359a0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
359b0 4f 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  Open(.          
359c0 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
359d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
359e0 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
359f0 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
35a00 50 61 67 65 72 29 0a 20 20 20 20 20 20 20 20 20  Pager).         
35a10 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
35a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35a30 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
35a40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
35a50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
35a60 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
35a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
35a90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
35aa0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
35ab0 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  d) );.    }.  . 
35ac0 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
35ad0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
35ae0 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a   header to the j
35af0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
35b00 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  open .    ** the
35b10 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
35b20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
35b30 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
35b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35b50 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   /* TODO: Check 
35b60 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20  if all of these 
35b70 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69  are really requi
35b80 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50  red. */.      pP
35b90 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
35ba0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
35bb0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
35bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
35bd0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
35be0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35bf0 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Hdr = 0;.      r
35c00 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
35c10 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
35c20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
35c30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35c40 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
35c50 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
35c60 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
35c70 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
35c80 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nal = 0;.  }else
35c90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
35ca0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
35cb0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
35cc0 44 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  D );.    pPager-
35cd0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
35ce0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b  WRITER_CACHEMOD;
35cf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
35d00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
35d10 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
35d20 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
35d30 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
35d40 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
35d50 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
35d60 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
35d70 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
35d80 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
35d90 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
35da0 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
35db0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
35dc0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
35dd0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
35de0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35df0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
35e00 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
35e10 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
35e20 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
35e30 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
35e40 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
35e50 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
35e60 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
35e70 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
35e80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
35e90 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
35ea0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
35eb0 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
35ec0 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
35ed0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
35ee0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
35ef0 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
35f00 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
35f10 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
35f20 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
35f30 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
35f40 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
35f50 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
35f60 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
35f70 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
35f80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
35f90 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
35fa0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
35fb0 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
35fc0 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
35fd0 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
35fe0 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
35ff0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
36000 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
36010 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
36020 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
36030 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
36040 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
36050 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
36060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36070 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
36080 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
36090 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
360a0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
360b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
360c0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
360d0 64 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67  de ) return pPag
360e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
360f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36100 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41  State>=PAGER_REA
36110 44 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65  DER && pPager->e
36120 53 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f  State<PAGER_ERRO
36130 52 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  R );.  pPager->s
36140 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
36150 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
36160 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50  .  if( ALWAYS(pP
36170 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36180 47 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20  GER_READER) ){. 
36190 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
361a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
361b0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67   );..    if( pag
361c0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
361d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
361e0 74 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e  the pager is con
361f0 66 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c  figured to use l
36200 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
36210 75 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20  usive, and an.  
36220 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
36230 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36240 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72  abase is not alr
36250 65 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69  eady held, obtai
36260 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20  n it now..      
36270 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  */.      if( pPa
36280 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
36290 64 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c  de && sqlite3Wal
362a0 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
362b0 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20  ager->pWal, -1) 
362c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
362d0 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
362e0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
362f0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
36300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
36310 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
36320 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
36330 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36340 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
36350 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31  (pPager->pWal, 1
36360 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
36370 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72    /* Grab the wr
36380 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
36390 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63  log file. If suc
363a0 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65  cessful, upgrade
363b0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47   to.      ** PAG
363c0 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
363d0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  e. Otherwise, re
363e0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
363f0 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
36400 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62  ..      ** The b
36410 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e  usy-handler is n
36420 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e  ot invoked if an
36430 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
36440 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a   already.      *
36450 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74  * holds the writ
36460 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69  e-lock. If possi
36470 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c  ble, the upper l
36480 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69  ayer will call i
36490 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
364a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
364b0 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73  lBeginWriteTrans
364c0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
364d0 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Wal);.    }else{
364e0 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e  .      /* Obtain
364f0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
36500 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36510 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78   file. If the ex
36520 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20  Flag parameter. 
36530 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c       ** is true,
36540 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
36550 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
36560 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
36570 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  ock. The.      *
36580 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  * busy-handler c
36590 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75  allback can be u
365a0 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69  sed when upgradi
365b0 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53  ng to the EXCLUS
365c0 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63  IVE.      ** loc
365d0 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20  k, but not when 
365e0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45  obtaining the RE
365f0 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20  SERVED lock..   
36600 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
36610 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
36620 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
36630 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
36640 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
36650 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
36660 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
36670 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
36680 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
36690 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
366a0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
366b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
366c0 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52   /* Change to WR
366d0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
366e0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
366f0 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65    ** WAL mode se
36700 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20  ts Pager.eState 
36710 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  to PAGER_WRITER_
36720 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d  LOCKED or CACHEM
36730 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  OD.      ** when
36740 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20   it has an open 
36750 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
36760 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20   never to DBMOD 
36770 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20  or FINISHED..   
36780 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65     ** This is be
36790 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73  cause in those s
367a0 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  tates the code t
367b0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65  o roll back save
367c0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
367d0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79  transactions may
367e0 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
367f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
36800 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
36810 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
36820 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f   as well as into
36830 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
36840 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20   Which would be 
36850 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20  incorrect in .  
36860 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e      ** WAL mode.
36870 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36880 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
36890 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
368a0 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67  CKED;.      pPag
368b0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
368c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
368d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
368e0 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67  bFileSize = pPag
368f0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
36900 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
36910 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
36920 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61  bSize;.      pPa
36930 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
36940 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
36950 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36960 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
36970 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36980 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73  EADER );.    ass
36990 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
369a0 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
369b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
369c0 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20  ER_LOCKED );.   
369d0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
369e0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
369f0 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  er) );.  }..  PA
36a00 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
36a10 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
36a20 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
36a30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
36a40 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67  ./*.** Write pag
36a50 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65  e pPg onto the e
36a60 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  nd of the rollba
36a70 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  ck journal..*/.s
36a80 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
36a90 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41  NLINE int pagerA
36aa0 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b  ddPageToRollback
36ab0 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70  Journal(PgHdr *p
36ac0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36ad0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
36ae0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  er;.  int rc;.  
36af0 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61  u32 cksum;.  cha
36b00 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36 34  r *pData2;.  i64
36b10 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e   iOff = pPager->
36b20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
36b30 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
36b40 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
36b50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
36b60 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20 63  page that.  ** c
36b70 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
36b80 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
36b90 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
36ba0 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a 20  t verifies.  ** 
36bb0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20  that we do not. 
36bc0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
36bd0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
36be0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
36bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
36c00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
36c10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
36c20 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28 70  ff );.  CODEC2(p
36c30 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
36c40 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c  a, pPg->pgno, 7,
36c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36c60 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20  OMEM, pData2);. 
36c70 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
36c80 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
36c90 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a  *)pData2);..  /*
36ca0 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
36cb0 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
36cc0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f   occurs while jo
36cd0 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
36ce0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
36cf0 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
36d00 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
36d10 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
36d20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  .  ** Otherwise,
36d30 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
36d40 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
36d50 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
36d60 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b  in.  ** playback
36d70 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
36d80 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
36d90 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
36da0 20 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69   restored.  ** i
36db0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36dc0 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49  ile. And if an I
36dd0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
36de0 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20  hile doing so,. 
36df0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
36e00 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
36e10 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
36e20 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
36e30 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72  SYNC;..  rc = wr
36e40 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
36e50 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67  ->jfd, iOff, pPg
36e60 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72  ->pgno);.  if( r
36e70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
36e80 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
36e90 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
36ea0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
36eb0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
36ec0 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a  eSize, iOff+4);.
36ed0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36ee0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
36ef0 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
36f00 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
36f10 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61   iOff+pPager->pa
36f20 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29  geSize+4, cksum)
36f30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
36f40 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
36f50 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28 22  c;..  IOTRACE(("
36f60 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
36f70 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
36f80 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
36f90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
36fa0 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
36fb0 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
36fc0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
36fd0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
36fe0 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 54  count);.  PAGERT
36ff0 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
37000 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
37010 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
37020 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47 45  \n",.       PAGE
37030 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
37040 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
37050 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
37060 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
37070 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
37080 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70 50  sh(pPg)));..  pP
37090 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
370a0 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d 3e   += 8 + pPager->
370b0 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  pageSize;.  pPag
370c0 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73  er->nRec++;.  as
370d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
370e0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
370f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
37100 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
37110 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
37120 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73  pgno);.  testcas
37130 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
37140 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MEM );.  assert(
37150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
37160 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
37170 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64  EM );.  rc |= ad
37180 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
37190 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
371a0 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74  >pgno);.  assert
371b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
371c0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
371d0 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
371e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
371f0 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20  k a single data 
37200 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
37210 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77  e. The page is w
37220 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
37230 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  .** main journal
37240 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   or sub-journal 
37250 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20  as required. If 
37260 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  the page is writ
37270 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20  ten into.** one 
37280 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c  of the journals,
37290 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
372a0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
372b0 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70   the .** Pager.p
372c0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63  InJournal bitvec
372d0 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61   and the PagerSa
372e0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
372f0 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20  oint bitvecs.** 
37300 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65  of any open save
37310 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70  points as approp
37320 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
37330 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
37340 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
37350 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
37360 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
37370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37380 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  K;..  /* This ro
37390 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c  utine is not cal
373a0 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72 69  led unless a wri
373b0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
373c0 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a  as already .  **
373d0 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20 54   been started. T
373e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
373f0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
37400 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  e open at this p
37410 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73  oint..  ** It is
37420 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e   never called in
37430 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
37440 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
37450 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37460 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37470 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  CKED.       || p
37480 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
37490 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
374a0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
374b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
374c0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
374d0 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
374e0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
374f0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
37500 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37510 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20  >errCode==0 );. 
37520 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
37530 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
37540 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
37550 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75  );..  /* The jou
37560 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
37570 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48 69  to be opened. Hi
37580 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69  gher level routi
37590 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  nes have already
375a0 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74  .  ** obtained t
375b0 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f 63  he necessary loc
375c0 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20  ks to begin the 
375d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
375e0 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a 20  n, but the.  ** 
375f0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
37600 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20 62   might not yet b
37610 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20  e open. Open it 
37620 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20 74  now if this is t
37630 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  he case..  **.  
37640 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  ** This is done 
37650 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73  before calling s
37660 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
37670 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20 70  Dirty() on the p
37680 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  age. .  ** Other
37690 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72 65  wise, if it were
376a0 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c 6c   done after call
376b0 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
376c0 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74 68  eMakeDirty(), th
376d0 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  en.  ** an error
376e0 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e 64   might occur and
376f0 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c 64   the pager would
37700 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54 45   end up in WRITE
37710 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a 20  R_LOCKED state. 
37720 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20 6d   ** with pages m
37730 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 69  arked as dirty i
37740 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 2a  n the cache..  *
37750 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
37760 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
37770 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20  ITER_LOCKED ){. 
37780 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
37790 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
377a0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
377b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
377c0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
377d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
377e0 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
377f0 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20  R_CACHEMOD );.  
37800 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
37810 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
37820 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  r) );..  /* Mark
37830 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 69   the page that i
37840 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f  s about to be mo
37850 64 69 66 69 65 64 20 61 73 20 64 69 72 74 79 2e  dified as dirty.
37860 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61   */.  sqlite3Pca
37870 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
37880 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f  );..  /* If a ro
37890 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69  llback journal i
378a0 73 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d  s in use, them m
378b0 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 61 67  ake sure the pag
378c0 65 20 74 68 61 74 20 69 73 20 61 62 6f 75 74 0a  e that is about.
378d0 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 69    ** to change i
378e0 73 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  s in the rollbac
378f0 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  k journal, or if
37900 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6e   the page is a n
37910 65 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a  ew page off.  **
37920 20 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68 65   then end of the
37930 20 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65   file, make sure
37940 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73   it is marked as
37950 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
37960 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
37970 20 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   (pPager->pInJou
37980 72 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70  rnal!=0) == isOp
37990 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
379a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
379b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20  >pInJournal!=0. 
379c0 20 20 26 26 20 73 71 6c 69 74 65 33 42 69 74 76    && sqlite3Bitv
379d0 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50  ecTestNotNull(pP
379e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
379f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a  , pPg->pgno)==0.
37a00 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
37a10 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
37a20 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ger)==0 );.    i
37a30 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
37a40 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
37a50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
37a60 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c  agerAddPageToRol
37a70 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67  lbackJournal(pPg
37a80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
37a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37aa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
37ac0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50  se{.      if( pP
37ad0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
37ae0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
37af0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
37b00 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37b10 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
37b20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52   }.      PAGERTR
37b30 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
37b40 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
37b50 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
37b60 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
37b70 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
37b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,.             (
37b90 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
37ba0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
37bb0 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )));.    }.  }..
37bc0 20 20 2f 2a 20 54 68 65 20 50 47 48 44 52 5f 44    /* The PGHDR_D
37bd0 49 52 54 59 20 62 69 74 20 69 73 20 73 65 74 20  IRTY bit is set 
37be0 61 62 6f 76 65 20 77 68 65 6e 20 74 68 65 20 70  above when the p
37bf0 61 67 65 20 77 61 73 20 61 64 64 65 64 20 74 6f  age was added to
37c00 20 74 68 65 20 64 69 72 74 79 2d 6c 69 73 74 0a   the dirty-list.
37c10 20 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72 65 20    ** and before 
37c20 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65  writing the page
37c30 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61   into the rollba
37c40 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 61 69  ck journal.  Wai
37c50 74 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a  t until now,.  *
37c60 2a 20 61 66 74 65 72 20 74 68 65 20 70 61 67 65  * after the page
37c70 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
37c80 73 66 75 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c 65  sfully journalle
37c90 64 2c 20 62 65 66 6f 72 65 20 73 65 74 74 69 6e  d, before settin
37ca0 67 20 74 68 65 0a 20 20 2a 2a 20 50 47 48 44 52  g the.  ** PGHDR
37cb0 5f 57 52 49 54 45 41 42 4c 45 20 62 69 74 20 74  _WRITEABLE bit t
37cc0 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
37cd0 61 74 20 74 68 65 20 70 61 67 65 20 63 61 6e 20  at the page can 
37ce0 62 65 20 73 61 66 65 6c 79 20 6d 6f 64 69 66 69  be safely modifi
37cf0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  ed..  */.  pPg->
37d00 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 57  flags |= PGHDR_W
37d10 52 49 54 45 41 42 4c 45 3b 0a 20 20 0a 20 20 2f  RITEABLE;.  .  /
37d20 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
37d30 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
37d40 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
37d50 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
37d60 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
37d70 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
37d80 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
37d90 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  l..  */.  if( pP
37da0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
37db0 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  >0 ){.    rc = s
37dc0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52  ubjournalPageIfR
37dd0 65 71 75 69 72 65 64 28 70 50 67 29 3b 0a 20 20  equired(pPg);.  
37de0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
37df0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
37e00 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a 2f 0a   and return. */.
37e10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
37e20 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
37e30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
37e40 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
37e50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37e60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
37e70 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66   is a variant of
37e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37e90 74 65 28 29 20 74 68 61 74 20 72 75 6e 73 20 77  te() that runs w
37ea0 68 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  hen the sector s
37eb0 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72  ize.** is larger
37ec0 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 73   than the page s
37ed0 69 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b  ize.  SQLite mak
37ee0 65 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61 62  es the (reasonab
37ef0 6c 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20 74  le) assumption t
37f00 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73  hat.** all bytes
37f10 20 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72 65   of a sector are
37f20 20 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68 65   written togethe
37f30 72 20 62 79 20 68 61 72 64 77 61 72 65 2e 20 20  r by hardware.  
37f40 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65 73  Hence, all bytes
37f50 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20   of.** a sector 
37f60 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
37f70 61 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f 66  alled in case of
37f80 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e   a power loss in
37f90 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
37fa0 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a  * a write..**.**
37fb0 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73 65   Usually, the se
37fc0 63 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65 73  ctor size is les
37fd0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
37fe0 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  to the page size
37ff0 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61  , in which.** ca
38000 73 65 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  se pages can be 
38010 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72 69  individually wri
38020 74 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tten.  This rout
38030 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e  ine only runs in
38040 20 74 68 65 0a 2a 2a 20 65 78 63 65 70 74 69 6f   the.** exceptio
38050 6e 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 74  nal case where t
38060 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
38070 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
38080 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f   sector size..*/
38090 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
380a0 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65  OINLINE int page
380b0 72 57 72 69 74 65 4c 61 72 67 65 53 65 63 74 6f  rWriteLargeSecto
380c0 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  r(PgHdr *pPg){. 
380d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
380e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
380f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
38100 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
38110 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
38120 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
38130 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
38140 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
38150 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
38160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
38170 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
38180 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
38190 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 69  cated on. */.  i
381a0 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20 20  nt nPage = 0;   
381b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
381c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
381d0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
381e0 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  o journal */.  i
381f0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
38200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
38210 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
38220 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
38230 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
38240 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67   True if any pag
38250 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44  e has PGHDR_NEED
38260 5f 53 59 4e 43 20 2a 2f 0a 20 20 50 61 67 65 72  _SYNC */.  Pager
38270 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
38280 70 50 61 67 65 72 3b 20 2f 2a 20 54 68 65 20 70  pPager; /* The p
38290 61 67 65 72 20 74 68 61 74 20 6f 77 6e 73 20 70  ager that owns p
382a0 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61  Pg */.  Pgno nPa
382b0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
382c0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
382d0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
382e0 7a 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  ze);..  /* Set t
382f0 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f  he doNotSpill NO
38300 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20 54  SYNC bit to 1. T
38310 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
38320 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20  e cannot allow. 
38330 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65   ** a journal he
38340 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
38350 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
38360 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
38370 79 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  y.  ** this func
38380 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tion..  */.  ass
38390 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
383a0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
383b0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
383c0 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29  PILLFLAG_NOSYNC)
383d0 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ==0 );.  pPager-
383e0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
383f0 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b  PILLFLAG_NOSYNC;
38400 0a 0a 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63  ..  /* This tric
38410 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
38420 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
38430 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
38440 65 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20 69 6e  e are.  ** an in
38450 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
38460 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
38470 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
38480 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 6f 66  entifier.  ** of
38490 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
384a0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
384b0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
384c0 0a 20 20 2a 2f 0a 20 20 70 67 31 20 3d 20 28 28  .  */.  pg1 = ((
384d0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
384e0 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
384f0 31 29 29 20 2b 20 31 3b 0a 0a 20 20 6e 50 61 67  1)) + 1;..  nPag
38500 65 43 6f 75 6e 74 20 3d 20 70 50 61 67 65 72 2d  eCount = pPager-
38510 3e 64 62 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  >dbSize;.  if( p
38520 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
38530 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  unt ){.    nPage
38540 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
38550 70 67 31 29 2b 31 3b 0a 20 20 7d 65 6c 73 65 20  pg1)+1;.  }else 
38560 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
38570 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
38580 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61  Count ){.    nPa
38590 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
385a0 31 2d 70 67 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  1-pg1;.  }else{.
385b0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
385c0 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 7d 0a  ePerSector;.  }.
385d0 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
385e0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 67 31 3c  );.  assert(pg1<
385f0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61  =pPg->pgno);.  a
38600 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
38610 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
38620 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
38630 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
38640 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
38650 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
38660 69 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  i;.    PgHdr *pP
38670 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 67 3d  age;.    if( pg=
38680 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
38690 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
386a0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
386b0 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
386c0 20 20 69 66 28 20 70 67 21 3d 50 41 47