/ Hex Artifact Content
Login

Artifact 94e8c52c0f91fbf7059ffbbd3be7939ee5122221e0e63855df7ba83100733580:


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 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  file */.#ifndef 
7ed0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43  SQLITE_OMIT_CONC
7ee0: 55 52 52 45 4e 54 0a 20 20 42 69 74 76 65 63 20  URRENT.  Bitvec 
7ef0: 2a 70 41 6c 6c 52 65 61 64 3b 20 20 20 20 20 20  *pAllRead;      
7f00: 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 72 65       /* Pages re
7f10: 61 64 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e  ad within curren
7f20: 74 20 43 4f 4e 43 55 52 52 45 4e 54 20 74 72 61  t CONCURRENT tra
7f30: 6e 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ns. */.#endif.  
7f40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7f50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
7f60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f70: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
7f80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
7f90: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
7fa0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
7fb0: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
7fc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7fd0: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
7fe0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
7ff0: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
8000: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
8010: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
8020: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
8030: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
8040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8050: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
8060: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
8070: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
8080: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
8090: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
80a0: 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
80b0: 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a   *pBackup;    /*
80c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74   Pointer to list
80d0: 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b   of ongoing back
80e0: 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a  up processes */.
80f0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
8100: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
8110: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
8120: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
8130: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8150: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
8160: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
8170: 5b 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74  [] */.  u32 iDat
8180: 61 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20  aVersion;       
8190: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
81a0: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
81b0: 20 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73   content changes
81c0: 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c   */.  char dbFil
81d0: 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20  eVers[16];      
81e0: 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65    /* Changes whe
81f0: 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66  never database f
8200: 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a  ile changes */..
8210: 20 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20    int nMmapOut; 
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8230: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20   Number of mmap 
8240: 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
8250: 6f 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20  outstanding */. 
8260: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
8270: 7a 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  zMmap;       /* 
8280: 44 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20  Desired maximum 
8290: 6d 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50  mmap size */.  P
82a0: 67 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c  gHdr *pMmapFreel
82b0: 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist;       /* Li
82c0: 73 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20  st of free mmap 
82d0: 70 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44  page headers (pD
82e0: 69 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20  irty) */.  /*.  
82f0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f  ** End of the ro
8300: 75 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67  utinely-changing
8310: 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20   class members. 
8320: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
8330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20  ************/.. 
8370: 20 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20   u16 nExtra;    
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8390: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
83a0: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
83b0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
83c0: 69 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20  i16 nReserve;   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
83e0: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
83f0: 62 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20  bytes at end of 
8400: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75  each page */.  u
8410: 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20  32 vfsFlags;    
8420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
8430: 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
8440: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
8450: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8470: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
8480: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
8490: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  ack */.  int pag
84a0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
84b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
84c0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
84d0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  e */.  Pgno mxPg
84e0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
84f0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c     /* Maximum al
8500: 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68  lowed size of th
8510: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
8520: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  i64 journalSizeL
8530: 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
8540: 69 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65  ize limit for pe
8550: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
8560: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72   files */.  char
8570: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
8580: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
8590: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
85a0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
85b0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
85c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
85d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
85e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  e */.  int (*xBu
85f0: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
8600: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
8610: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
8620: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
8630: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
8640: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
8650: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
8660: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20  andler */.  int 
8670: 61 53 74 61 74 5b 34 5d 3b 20 20 20 20 20 20 20  aStat[4];       
8680: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8690: 20 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73   cache hits, mis
86a0: 73 65 73 2c 20 77 72 69 74 65 73 2c 20 73 70 69  ses, writes, spi
86b0: 6c 6c 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  lls */.#ifdef SQ
86c0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
86d0: 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
86e0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
86f0: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 20 2a  ase pages read *
8700: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
8710: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
8720: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
8730: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
8740: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
8750: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 47 65 74   */.  int (*xGet
8760: 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62  )(Pager*,Pgno,Db
8770: 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20 2f 2a 20  Page**,int); /* 
8780: 52 6f 75 74 69 6e 65 20 74 6f 20 66 65 74 63 68  Routine to fetch
8790: 20 61 20 70 61 74 63 68 20 2a 2f 0a 23 69 66 64   a patch */.#ifd
87a0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
87b0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
87c0: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
87d0: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
87e0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
87f0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8800: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8810: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8820: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8830: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8840: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8850: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
8860: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
8870: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
8880: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
8890: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
88a0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
88b0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
88c0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
88d0: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
88e0: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
88f0: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8900: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8910: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8920: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8930: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8940: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8950: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
8960: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
8970: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8980: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
8990: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
89a0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
89b0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
89c0: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
89d0: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
89e0: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
89f0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8a00: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8a10: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8a20: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8a30: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8a40: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8a50: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
8a60: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
8a70: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
8a80: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
8a90: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
8aa0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
8ab0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8ac0: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8ad0: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8ae0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8af0: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8b00: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8b10: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8b20: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8b30: 52 49 54 45 20 32 0a 23 64 65 66 69 6e 65 20 50  RITE 2.#define P
8b40: 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c 20  AGER_STAT_SPILL 
8b50: 33 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  3../*.** The fol
8b60: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8b70: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8b80: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8b90: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8ba0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8bb0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8bc0: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8bd0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8be0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8bf0: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
8c00: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
8c10: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
8c20: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
8c30: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
8c40: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
8c50: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8c60: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8c70: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8c80: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8c90: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8ca0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8cb0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8cc0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8cd0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8ce0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8cf0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
8d00: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
8d10: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
8d20: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
8d30: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
8d40: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
8d50: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8d60: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8d70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8d80: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8d90: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8da0: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8db0: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8dc0: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8dd0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8de0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8df0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8e00: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8e10: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8e20: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8e30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8e40: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8e50: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8e60: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8e70: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8e80: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8e90: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8ea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8eb0: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8ec0: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8ed0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8ee0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8ef0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8f00: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8f10: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8f20: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8f30: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8f40: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8f50: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8f60: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8f70: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8f80: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8f90: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8fa0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8fb0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8fc0: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8fd0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8fe0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8ff0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
9000: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
9010: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
9020: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
9030: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
9040: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
9050: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
9060: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
9070: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
9080: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
9090: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
90a0: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
90b0: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
90c0: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
90d0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
90e0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
90f0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
9100: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
9110: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
9120: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
9130: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
9140: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
9150: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
9160: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
9170: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
9180: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
9190: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
91a0: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
91b0: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
91c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
91d0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
91e0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
91f0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
9200: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
9210: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
9220: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
9230: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
9240: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
9250: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
9260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
9270: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
9280: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
9290: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
92a0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
92b0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
92c0: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
92d0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
92e0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
92f0: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
9300: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
9310: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
9320: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
9330: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
9340: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
9350: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9360: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9370: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9380: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9390: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
93a0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
93b0: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
93c0: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
93d0: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
93e0: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
93f0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
9400: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
9410: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
9420: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
9430: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
9440: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
9450: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9460: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9470: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9480: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9490: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
94a0: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
94b0: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
94c0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
94d0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
94e0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
94f0: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
9500: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
9510: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
9520: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
9530: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
9540: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
9550: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9560: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9570: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9580: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9590: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
95a0: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
95b0: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
95c0: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
95d0: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
95e0: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
95f0: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
9600: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
9610: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9620: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
9630: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
9640: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
9650: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9660: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9670: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9680: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9690: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
96a0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
96b0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
96c0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
96d0: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
96e0: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
96f0: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
9700: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
9710: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
9720: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
9730: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
9740: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
9750: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9760: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9770: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9780: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9790: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
97a0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
97b0: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
97c0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
97d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
97e0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
97f0: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
9800: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
9810: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
9820: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
9830: 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
9840: 41 44 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  AD./*.** Return 
9850: 74 72 75 65 20 69 66 20 70 61 67 65 20 70 67 6e  true if page pgn
9860: 6f 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  o can be read di
9870: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
9880: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
9890: 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c   by the b-tree l
98a0: 61 79 65 72 2e 20 54 68 69 73 20 69 73 20 74 68  ayer. This is th
98b0: 65 20 63 61 73 65 20 69 66 3a 0a 2a 2a 0a 2a 2a  e case if:.**.**
98c0: 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
98d0: 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 0a  e file is open,.
98e0: 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
98f0: 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20   no dirty pages 
9900: 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
9910: 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 65 73  d.**   * the des
9920: 69 72 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  ired page is not
9930: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
9940: 65 20 77 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 69  e wal file..*/.i
9950: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  nt sqlite3PagerD
9960: 69 72 65 63 74 52 65 61 64 4f 6b 28 50 61 67 65  irectReadOk(Page
9970: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
9980: 70 67 6e 6f 29 7b 0a 20 20 69 66 28 20 70 50 61  pgno){.  if( pPa
9990: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
99a0: 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
99b0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 43  .  if( sqlite3PC
99c0: 61 63 68 65 49 73 44 69 72 74 79 28 70 50 61 67  acheIsDirty(pPag
99d0: 65 72 2d 3e 70 50 43 61 63 68 65 29 20 29 20 72  er->pPCache) ) r
99e0: 65 74 75 72 6e 20 30 3b 0a 23 69 66 6e 64 65 66  eturn 0;.#ifndef
99f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
9a00: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
9a10: 57 61 6c 20 29 7b 0a 20 20 20 20 75 33 32 20 69  Wal ){.    u32 i
9a20: 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Read = 0;.    in
9a30: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
9a40: 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
9a50: 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
9a60: 20 70 67 6e 6f 2c 20 26 69 52 65 61 64 29 3b 0a   pgno, &iRead);.
9a70: 20 20 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d      return (rc==
9a80: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 52 65  SQLITE_OK && iRe
9a90: 61 64 3d 3d 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  ad==0);.  }.#end
9aa0: 69 66 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  if.  return 1;.}
9ab0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
9ac0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
9ad0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
9ae0: 73 65 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70  seWal(x) ((x)->p
9af0: 57 61 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20  Wal!=0).#else.# 
9b00: 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57  define pagerUseW
9b10: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9b20: 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
9b30: 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20  l(x) 0.# define 
9b40: 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76  pagerWalFrames(v
9b50: 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69  ,w,x,y) 0.# defi
9b60: 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  ne pagerOpenWalI
9b70: 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49  fPresent(z) SQLI
9b80: 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70  TE_OK.# define p
9b90: 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
9ba0: 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49  nsaction(z) SQLI
9bb0: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69  TE_OK.#endif..#i
9bc0: 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a  fndef NDEBUG ./*
9bd0: 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a  .** Usage:.**.**
9be0: 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
9bf0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
9c00: 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54  ager) );.**.** T
9c10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e  his function run
9c20: 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74  s many asserts t
9c30: 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e  o try to find in
9c40: 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e  consistencies in
9c50: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  .** the internal
9c60: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
9c70: 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ger object..*/.s
9c80: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
9c90: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
9ca0: 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20  er *p){.  Pager 
9cb0: 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20  *pPager = p;..  
9cc0: 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62 65  /* State must be
9cd0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73   valid. */.  ass
9ce0: 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d  ert( p->eState==
9cf0: 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20  PAGER_OPEN.     
9d00: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9d10: 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20  PAGER_READER.   
9d20: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9d30: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
9d40: 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
9d50: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
9d60: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
9d70: 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53  .       || p->eS
9d80: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
9d90: 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20  ER_DBMOD.       
9da0: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9db0: 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
9dc0: 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  HED.       || p-
9dd0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
9de0: 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  RROR.  );..  /* 
9df0: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
9e00: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c  e current state,
9e10: 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e   a temp-file con
9e20: 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62  nection always b
9e30: 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69  ehaves.  ** as i
9e40: 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c  f it has an excl
9e50: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
9e60: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9e70: 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74 65   It never update
9e80: 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67  s.  ** the chang
9e90: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c  e-counter field,
9ea0: 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f   so the changeCo
9eb0: 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20  untDone flag is 
9ec0: 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f  always set..  */
9ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65  .  assert( p->te
9ee0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e  mpFile==0 || p->
9ef0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9f00: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
9f10: 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  t( p->tempFile==
9f20: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61  0 || pPager->cha
9f30: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a  ngeCountDone );.
9f40: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
9f50: 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20  Journal flag is 
9f60: 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e  clear, the journ
9f70: 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20  al-mode must be 
9f80: 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64  "OFF". .  ** And
9f90: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
9fa0: 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74  mode is "OFF", t
9fb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9fc0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e  must not be open
9fd0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
9fe0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
9ff0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a000: 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65  DE_OFF || p->use
a010: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
a020: 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d  ert( p->journalM
a030: 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
a040: 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69  ALMODE_OFF || !i
a050: 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b  sOpen(p->jfd) );
a060: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
a070: 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20  t MEMDB implies 
a080: 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69  noSync. And an i
a090: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
a0a0: 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68  . Since .  ** th
a0b0: 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d  is means an in-m
a0c0: 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72 66  emory pager perf
a0d0: 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c  orms no IO at al
a0e0: 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63  l, it cannot enc
a0f0: 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74  ounter .  ** eit
a100: 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  her SQLITE_IOERR
a110: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   or SQLITE_FULL 
a120: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
a130: 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a  or while finaliz
a140: 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72  ing .  ** a jour
a150: 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f  nal file. (altho
a160: 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ugh the in-memor
a170: 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d  y journal implem
a180: 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20  entation may .  
a190: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
a1a0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69  _IOERR_NOMEM whi
a1b0: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  le the journal f
a1c0: 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72 69  ile is being wri
a1d0: 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20  tten). It .  ** 
a1e0: 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74  is therefore not
a1f0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e   possible for an
a200: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
a210: 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
a220: 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ROR .  ** state.
a230: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
a240: 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
a250: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20   !isOpen(p->fd) 
a260: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
a270: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20  ->noSync );.    
a280: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
a290: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a2a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a2b0: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a2c0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a2d0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
a2e0: 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ORY .    );.    
a2f0: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
a300: 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
a310: 26 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  & p->eState!=PAG
a320: 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61  ER_OPEN );.    a
a330: 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
a340: 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  al(p)==0 );.  }.
a350: 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43  .  /* If changeC
a360: 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c  ountDone is set,
a370: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
a380: 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
a390: 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e   be held.  ** on
a3a0: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
a3b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a3c0: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
a3d0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
a3e0: 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f  eLock>=RESERVED_
a3f0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
a400: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44  ( p->eLock!=PEND
a410: 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73  ING_LOCK );..  s
a420: 77 69 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65  witch( p->eState
a430: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
a440: 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61  ER_OPEN:.      a
a450: 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
a460: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a470: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a480: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a490: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a4a0: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a4b0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a4c0: 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  )==0 || pPager->
a4d0: 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
a4e0: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a4f0: 73 65 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a  se PAGER_READER:
a500: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a510: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a520: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a530: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a540: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
a550: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
a560: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41  t( p->eLock>=SHA
a570: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
a580: 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
a590: 73 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  se PAGER_WRITER_
a5a0: 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73  LOCKED:.      as
a5b0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d  sert( p->eLock!=
a5c0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a  UNKNOWN_LOCK );.
a5d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a5e0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
a5f0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
a600: 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
a610: 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
a620: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a630: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a640: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
a650: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a660: 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 0a  OMIT_CONCURRENT.
a670: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a680: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
a690: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a6a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c   || pPager->pAll
a6b0: 52 65 61 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20  Read );.#endif. 
a6c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a6d0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a6e0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a6f0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a700: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a710: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a720: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a730: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a740: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a750: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a760: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a770: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a780: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a790: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a7a0: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a7b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a7c0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a7d0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a7e0: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a7f0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a800: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a810: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a820: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a830: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a840: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a850: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a860: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a870: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a880: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a890: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a8a0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a8b0: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a8c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a8d0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a8e0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a8f0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a900: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a910: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a920: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a930: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a940: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a950: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a960: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a970: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a980: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a990: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9a0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9b0: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a9c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a9d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a9e0: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a9f0: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
aa00: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
aa10: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
aa20: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
aa30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
aa40: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
aa50: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
aa60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aa70: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
aa80: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
aa90: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
aaa0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
aab0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
aac0: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
aad0: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
aae0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
aaf0: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
ab00: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
ab10: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
ab20: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
ab30: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
ab40: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ab50: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
ab60: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
ab70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ab80: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
ab90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71            || (sq
aba0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
abb0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
abc0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
abd0: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
abe0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
abf0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
ac00: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
ac10: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
ac20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
ac30: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
ac40: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
ac50: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
ac60: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
ac70: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
ac80: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
ac90: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
aca0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
acb0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
acc0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
acd0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
ace0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
acf0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
ad00: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
ad10: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
ad20: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
ad30: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
ad40: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
ad50: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
ad60: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
ad70: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
ad80: 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  p->fd)&SQLITE_IO
ad90: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
ada0: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
adb0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
adc0: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
add0: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
ade0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
adf0: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
ae00: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
ae10: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
ae20: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
ae30: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
ae40: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
ae50: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
ae60: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
ae70: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
ae80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
ae90: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
aea0: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
aeb0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
aec0: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
aed0: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
aee0: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
aef0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
af00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
af10: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
af20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
af30: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
af40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
af50: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
af60: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
af70: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
af80: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
af90: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
afa0: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
afb0: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
afc0: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
afd0: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
afe0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
aff0: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
b000: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
b010: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
b020: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
b030: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
b040: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
b050: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
b060: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
b070: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2a 0a 2a  ate(pPager).**.*
b080: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
b090: 61 73 20 65 78 74 65 72 6e 61 6c 20 6c 69 6e 6b  as external link
b0a0: 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
b0b0: 73 75 70 70 72 65 73 73 20 63 6f 6d 70 69 6c 65  suppress compile
b0c0: 72 20 77 61 72 6e 69 6e 67 73 0a 2a 2a 20 61 62  r warnings.** ab
b0d0: 6f 75 74 20 61 6e 20 75 6e 75 73 65 64 20 66 75  out an unused fu
b0e0: 6e 63 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 65  nction.  It is e
b0f0: 6e 63 6c 6f 73 65 64 20 77 69 74 68 69 6e 20 53  nclosed within S
b100: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 6e 64 20  QLITE_DEBUG and 
b110: 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 61  so does.** not a
b120: 70 70 65 61 72 20 69 6e 20 6e 6f 72 6d 61 6c 20  ppear in normal 
b130: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63 68 61 72 20  builds..*/.char 
b140: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
b150: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
b160: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
b170: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
b180: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
b190: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
b1a0: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
b1b0: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
b1c0: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
b1d0: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
b1e0: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
b1f0: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
b200: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
b210: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
b220: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
b230: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
b240: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
b250: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
b260: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
b270: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
b280: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
b290: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
b2a0: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
b2b0: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
b2c0: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
b2d0: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
b2e0: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
b2f0: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
b300: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
b310: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
b320: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
b330: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
b340: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
b350: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
b360: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
b370: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
b380: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b390: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
b3a0: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
b3b0: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
b3c0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b3d0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
b3e0: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
b3f0: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
b400: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b410: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
b420: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
b430: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b440: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
b450: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
b460: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
b470: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b480: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
b490: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
b4a0: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
b4b0: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b4c0: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
b4d0: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
b4e0: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
b4f0: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
b500: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
b510: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
b520: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
b530: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
b540: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
b550: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
b560: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
b570: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
b580: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
b590: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
b5a0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
b5b0: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
b5c0: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
b5d0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
b5e0: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
b5f0: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
b600: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b610: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b620: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
b630: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
b640: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b650: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b660: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
b670: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
b680: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b690: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
b6a0: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
b6b0: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b6c0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b6d0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
b6e0: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
b6f0: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
b700: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b710: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b720: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
b730: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
b740: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b750: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b760: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b770: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b780: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b790: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b7a0: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b7b0: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b7c0: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b7d0: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b7e0: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b7f0: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b800: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b810: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b820: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b830: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b840: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
b850: 63 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f  ces to the vario
b860: 75 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20  us page getters 
b870: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
b880: 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65  tPageNormal(Page
b890: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b8a0: 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  ,int);.static in
b8b0: 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50  t getPageError(P
b8c0: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b8d0: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51  e**,int);.#if SQ
b8e0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b8f0: 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
b900: 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65  getPageMMap(Page
b910: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b920: 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ,int);.#endif../
b930: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67  *.** Set the Pag
b940: 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66  er.xGet method f
b950: 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  or the appropria
b960: 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  te routine used 
b970: 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74  to fetch.** cont
b980: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
b990: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b9a0: 69 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68  id setGetterMeth
b9b0: 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  od(Pager *pPager
b9c0: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
b9d0: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b9e0: 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67  pPager->xGet = g
b9f0: 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66  etPageError;.#if
ba00: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
ba10: 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20  _SIZE>0.  }else 
ba20: 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
ba30: 67 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49  ger).#ifdef SQLI
ba40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
ba50: 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  && pPager->xCode
ba60: 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b  c==0.#endif.  ){
ba70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
ba80: 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b  t = getPageMMap;
ba90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
baa0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
bab0: 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 */.  }else{.  
bac0: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
bad0: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a   getPageNormal;.
bae0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
baf0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
bb00: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
bb10: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
bb20: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
bb30: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
bb40: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
bb50: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
bb60: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
bb70: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
bb80: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
bb90: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
bba0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
bbb0: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
bbc0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
bbd0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
bbe0: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
bbf0: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
bc00: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
bc10: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
bc20: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
bc30: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
bc40: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
bc50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
bc60: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
bc70: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
bc80: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
bc90: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
bca0: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
bcb0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
bcc0: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
bcd0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
bce0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
bcf0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
bd00: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
bd10: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
bd20: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
bd30: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
bd40: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
bd50: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
bd60: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
bd70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
bd80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
bd90: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
bda0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
bdb0: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
bdc0: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
bdd0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
bde0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
bdf0: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
be00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
be10: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
be20: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
be30: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
be40: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
be50: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
be60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
be70: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
be80: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
be90: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
bea0: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
beb0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
bec0: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
bed0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
bee0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
bef0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
bf00: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
bf10: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
bf20: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
bf30: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
bf40: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
bf50: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
bf60: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
bf70: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
bf80: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
bf90: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
bfa0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
bfb0: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
bfc0: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
bfd0: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
bfe0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
bff0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
c000: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
c010: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
c020: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c030: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
c040: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
c050: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
c060: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
c070: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
c080: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
c090: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
c0a0: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
c0b0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
c0c0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
c0d0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
c0e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
c0f0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c100: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
c110: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
c120: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
c130: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
c140: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
c150: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
c160: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
c170: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
c180: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
c190: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
c1a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
c1b0: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
c1c0: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
c1d0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
c1e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
c1f0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
c200: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
c210: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
c220: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
c230: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
c240: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
c250: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
c260: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
c270: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
c280: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
c290: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
c2a0: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
c2b0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c2c0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c2d0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c2e0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c2f0: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
c300: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
c310: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
c320: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
c330: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
c340: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c350: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
c360: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
c370: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
c380: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c390: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c3a0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c3b0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
c3c0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c3d0: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
c3e0: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
c3f0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
c400: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
c410: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c420: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
c430: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
c440: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
c450: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
c460: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
c470: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c480: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
c490: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
c4a0: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
c4b0: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
c4c0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
c4d0: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
c4e0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
c4f0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
c500: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
c510: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
c520: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
c530: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c540: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
c550: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
c560: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c570: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
c580: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c590: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c5a0: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c5b0: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
c5c0: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
c5d0: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
c5e0: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
c5f0: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
c600: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
c610: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
c620: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
c630: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
c640: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
c650: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
c660: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
c670: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
c680: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
c690: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
c6a0: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
c6b0: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
c6c0: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
c6d0: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
c6e0: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
c6f0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
c700: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
c710: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
c720: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
c730: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
c740: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c750: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c760: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c770: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c780: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
c790: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
c7a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
c7b0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
c7c0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
c7d0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
c7e0: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
c7f0: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
c800: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
c810: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
c820: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
c830: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
c840: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
c850: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c860: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
c870: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
c880: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
c890: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
c8a0: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
c8b0: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
c8c0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
c8d0: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
c8e0: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
c8f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c900: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
c910: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
c920: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
c930: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
c940: 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d  write or.** atom
c950: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c960: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
c970: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
c980: 69 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a  is pager. The.**
c990: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
c9a0: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
c9b0: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
c9c0: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
c9d0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
c9e0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c9f0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
ca00: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
ca10: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
ca20: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
ca30: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
ca40: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
ca50: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
ca60: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
ca70: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
ca80: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
ca90: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge size..**.** I
caa0: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
cab0: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
cac0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
cad0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
cae0: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68  rnal .** file wh
caf0: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72  en it contains r
cb00: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
cb10: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
cb20: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f  e..**.** The ato
cb30: 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20  mic-batch-write 
cb40: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
cb50: 20 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65   be used if OsDe
cb60: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
cb70: 69 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73  ics().** returns
cb80: 20 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68   a value with th
cb90: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  e SQLITE_IOCAP_B
cba0: 41 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20  ATCH_ATOMIC bit 
cbb0: 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65  set. -1 is.** re
cbc0: 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
cbd0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ase..**.** If ne
cbe0: 69 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  ither optimizati
cbf0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
cc00: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
cc10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  /.static int jrn
cc20: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
cc30: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
cc40: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
cc50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
cc60: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
cc70: 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64  C_WRITE) \. || d
cc80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
cc90: 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
cca0: 43 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64  C_WRITE).  int d
ccb0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ccd0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
cce0: 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73  istics */..  ass
ccf0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
cd00: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20  er->fd) );.  dc 
cd10: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
cd20: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
cd30: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65  (pPager->fd);.#e
cd40: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
cd50: 41 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a  AMETER(pPager);.
cd60: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
cd70: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
cd80: 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  CH_ATOMIC_WRITE.
cd90: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
cda0: 53 69 7a 65 3e 30 20 26 26 20 28 64 63 26 53 51  Size>0 && (dc&SQ
cdb0: 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48  LITE_IOCAP_BATCH
cdc0: 5f 41 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20 20  _ATOMIC) ){.    
cdd0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23  return -1;.  }.#
cde0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
cdf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
ce00: 49 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20  IC_WRITE.  {.   
ce10: 20 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70   int nSector = p
ce20: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
ce30: 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
ce40: 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
ce50: 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Size;..    asser
ce60: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
ce70: 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
ce80: 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8));.    assert(
ce90: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
cea0: 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e  MIC64K==(65536>>
ceb0: 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  8));.    if( 0==
cec0: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
ced0: 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65  P_ATOMIC|(szPage
cee0: 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72  >>8)) || nSector
cef0: 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20  >szPage) ){.    
cf00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
cf10: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
cf20: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
cf30: 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c  Pager) + JOURNAL
cf40: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
cf50: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
cf60: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
cf70: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
cf80: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
cf90: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
cfa0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
cfb0: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
cfc0: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
cfd0: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
cfe0: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
cff0: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
d000: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
d010: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
d020: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
d030: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
d040: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
d050: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
d060: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
d070: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
d080: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d090: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
d0a0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
d0b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
d0c0: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
d0d0: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
d0e0: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
d0f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
d100: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
d110: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
d120: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
d130: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
d140: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
d150: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
d160: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
d170: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
d180: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
d190: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
d1a0: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
d1b0: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
d1c0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
d1d0: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
d1e0: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
d1f0: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
d200: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
d210: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
d220: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
d230: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
d240: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
d250: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
d260: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
d270: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
d280: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
d290: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
d2a0: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
d2b0: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
d2c0: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
d2d0: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
d2e0: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
d2f0: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
d300: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
d310: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
d320: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
d330: 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
d340: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
d350: 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
d360: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
d370: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
d380: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
d390: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
d3a0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
d3b0: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
d3c0: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
d3d0: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
d3e0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73  .#define pager_s
d3f0: 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23  et_pagehash(X).#
d400: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
d410: 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20  E(x).#endif  /* 
d420: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
d430: 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ES */../*.** Whe
d440: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
d450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d460: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
d470: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
d480: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
d490: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
d4a0: 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ad a master jour
d4b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72  nal file name fr
d4c0: 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f  om the .** end o
d4d0: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20  f the file and, 
d4e0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63  if successful, c
d4f0: 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65  opies it into me
d500: 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a  mory supplied .*
d510: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
d520: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
d530: 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ove writeMasterJ
d540: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65  ournal() for the
d550: 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20   format.** used 
d560: 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65  to store a maste
d570: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
d580: 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ame at the end o
d590: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
d5a0: 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20  ..**.** zMaster 
d5b0: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
d5c0: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
d5d0: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
d5e0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
d5f0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
d600: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
d610: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
d620: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
d630: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
d640: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
d650: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
d660: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
d670: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d680: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
d690: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
d6a0: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
d6b0: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
d6c0: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
d6d0: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
d6e0: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
d6f0: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
d700: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
d710: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
d720: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
d730: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
d740: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d750: 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65  present at the e
d760: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
d770: 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  l.** file, then 
d780: 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
d790: 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
d7a0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
d7b0: 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72  er. A.** nul-ter
d7c0: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
d7d0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
d7e0: 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  buffer following
d7f0: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
d800: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d810: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ..**.** If it is
d820: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
d830: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d840: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d850: 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73  present .** zMas
d860: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
d870: 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
d880: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
d890: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d8a0: 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e  urs while readin
d8b0: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
d8c0: 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69  al file, an SQLi
d8d0: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
d8e0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
d8f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
d900: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
d910: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
d920: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
d930: 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a  , u32 nMaster){.
d940: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d960: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
d970: 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
d980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
d990: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
d9a0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
d9b0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73   name */.  i64 s
d9c0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
d9d0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
d9e0: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
d9f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72  journal file pJr
da00: 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  nl */.  u32 cksu
da10: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
da20: 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75     /* MJ checksu
da30: 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  m value read fro
da40: 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
da50: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
da60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
da70: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
da80: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
da90: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
daa0: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
dab0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
dac0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61   header */.  zMa
dad0: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
dae0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
daf0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
db00: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
db10: 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a   &szJ)).   || sz
db20: 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54  J<16.   || SQLIT
db30: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
db40: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
db50: 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20  J-16, &len)).   
db60: 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  || len>=nMaster 
db70: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d 31  .   || len>szJ-1
db80: 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a  6.   || len==0 .
db90: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
dba0: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
dbb0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
dbc0: 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20   &cksum)).   || 
dbd0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
dbe0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
dbf0: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
dc00: 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d   szJ-8)).   || m
dc10: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
dc20: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a  ournalMagic, 8).
dc30: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
dc40: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
dc50: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
dc60: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
dc70: 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  -len)).  ){.    
dc80: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
dc90: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
dca0: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
dcb0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
dcc0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
dcd0: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
dce0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
dcf0: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d   zMaster[u];.  }
dd00: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
dd10: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
dd20: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
dd30: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
dd40: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
dd50: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
dd60: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
dd70: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
dd80: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
dd90: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
dda0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
ddb0: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
ddc0: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
ddd0: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
dde0: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
ddf0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
de00: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
de10: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a  */.    len = 0;.
de20: 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65    }.  zMaster[le
de30: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20  n] = '\0';.   . 
de40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
de50: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
de60: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  rn the offset of
de70: 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e   the sector boun
de80: 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64  dary at or immed
de90: 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f  iately .** follo
dea0: 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69  wing the value i
deb0: 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  n pPager->journa
dec0: 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61  lOff, assuming a
ded0: 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65   sector .** size
dee0: 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74   of pPager->sect
def0: 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a  orSize bytes..**
df00: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
df10: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
df20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e  :.**.**   Pager.
df30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20  journalOff      
df40: 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65      Return value
df50: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
df60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
df80: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
dfa0: 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20  *   512         
dfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
dfc0: 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20  2.**   100      
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20   512.**   2000  
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
e010: 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e  static i64 journ
e020: 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65  alHdrOffset(Page
e030: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
e040: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
e050: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
e060: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
e070: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
e080: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
e090: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
e0a0: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
e0b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e0c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
e0d0: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
e0e0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
e0f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
e100: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
e110: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
e120: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e130: 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
e140: 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  n offset;.}../*.
e150: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e160: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e170: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
e180: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
e190: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
e1a0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
e1b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e1c0: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77  e has not been w
e1d0: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74  ritten to.** wit
e1e0: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
e1f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65  transaction (i.e
e200: 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  . if Pager.journ
e210: 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a  alOff==0)..**.**
e220: 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69   If doTruncate i
e230: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68  s non-zero or th
e240: 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  e Pager.journalS
e250: 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c  izeLimit variabl
e260: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  e is.** set to 0
e270: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
e280: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e290: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
e2a0: 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73  n size. Otherwis
e2b0: 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32  e,.** zero the 2
e2c0: 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74  8-byte header at
e2d0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
e2e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
e2f0: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
e300: 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72  .** if the pager
e310: 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79   is not in no-sy
e320: 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  nc mode, sync th
e330: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
e340: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61  mmediately .** a
e350: 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20  fter writing or 
e360: 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a  truncating it..*
e370: 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f  *.** If Pager.jo
e380: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69  urnalSizeLimit i
e390: 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74  s set to a posit
e3a0: 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  ive, non-zero va
e3b0: 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c  lue, and.** foll
e3c0: 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61  owing the trunca
e3d0: 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20  tion or zeroing 
e3e0: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
e3f0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
e400: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
e410: 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72   in bytes is lar
e420: 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61  ger than this va
e430: 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  lue, then trunca
e440: 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
e450: 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e  l file to Pager.
e460: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
e470: 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72   bytes. The jour
e480: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  nal file does.**
e490: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
e4a0: 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  synced following
e4b0: 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e   this operation.
e4c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
e4d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62  error occurs, ab
e4e0: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
e4f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
e500: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  IO error code..*
e510: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  * Otherwise, ret
e520: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
e530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
e540: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
e550: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
e560: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
e570: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e5a0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e5b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
e5c0: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
e5d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  );.  assert( !sq
e5e0: 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
e5f0: 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  Memory(pPager->j
e600: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
e610: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e620: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
e630: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
e640: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
e650: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
e660: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
e670: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
e680: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
e690: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
e6a0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
e6b0: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
e6c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
e6d0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
e6e0: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
e6f0: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
e700: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
e710: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
e720: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e730: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
e740: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
e750: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
e760: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
e770: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e780: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
e790: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
e7a0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
e7b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
e7c0: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
e7d0: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61  |pPager->syncFla
e7e0: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
e7f0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
e800: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e810: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
e820: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
e830: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
e840: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
e850: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
e860: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
e870: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
e880: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
e890: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
e8a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e8b0: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
e8c0: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
e8d0: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
e8e0: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
e8f0: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
e900: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
e910: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
e920: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
e930: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
e940: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
e950: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e960: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
e970: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
e980: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e990: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
e9a0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
e9b0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
e9c0: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
e9d0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
e9e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
e9f0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
ea00: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
ea10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
ea20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ea30: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
ea40: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
ea50: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
ea60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
ea70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
ea80: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
ea90: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
eaa0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
eab0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
eac0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
ead0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
eae0: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
eaf0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
eb00: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
eb10: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
eb20: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
eb30: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
eb40: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
eb50: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
eb60: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
eb70: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
eb80: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
eb90: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
eba0: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
ebb0: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
ebc0: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
ebd0: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
ebe0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
ebf0: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
ec00: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
ec10: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
ec20: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
ec30: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
ec40: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
ec50: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
ec60: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
ec70: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
ec80: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
ec90: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
eca0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
ecb0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
ecc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
ece0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ecf0: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
ed00: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
ed10: 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  e;  /* Temporary
ed20: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62   space used to b
ed30: 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  uild header */. 
ed40: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28   u32 nHeader = (
ed50: 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u32)pPager->page
ed60: 53 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20  Size;/* Size of 
ed70: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
ed80: 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a  o by zHeader */.
ed90: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20    u32 nWrite;   
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
edc0: 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20  f header sector 
edd0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
ede0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee00: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
ee10: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
ee20: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
ee30: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
ee40: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
ee50: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69  be open. */..  i
ee60: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
ee70: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ee80: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
ee90: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
eea0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
eeb0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
eec0: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
eed0: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
eee0: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
eef0: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
ef00: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75   most recent jou
ef10: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20  rnal header was 
ef20: 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
ef30: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53  the .  ** PagerS
ef40: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
ef50: 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a  set fields now..
ef60: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
ef70: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
ef80: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
ef90: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
efa0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
efb0: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
efc0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
efd0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
efe0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
eff0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
f000: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
f010: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
f020: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f030: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f040: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  fset(pPager);.. 
f050: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
f060: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
f070: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
f080: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
f090: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
f0a0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f0b0: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
f0c0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
f0d0: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
f0e0: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
f0f0: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
f100: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
f110: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
f120: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
f130: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
f140: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
f150: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
f160: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
f170: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
f180: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
f190: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
f1a0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
f1b0: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
f1c0: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
f1d0: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
f1e0: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
f1f0: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
f200: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
f210: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
f220: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
f230: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
f240: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f250: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
f260: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
f270: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
f280: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
f290: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
f2a0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20  occurred whilst 
f2b0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
f2c0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
f2d0: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
f2e0: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
f2f0: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
f300: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
f310: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
f320: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
f330: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
f340: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
f350: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
f360: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
f370: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
f380: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
f390: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
f3a0: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
f3b0: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
f3c0: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
f3d0: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
f3e0: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
f3f0: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
f400: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
f410: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
f420: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
f430: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
f440: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
f450: 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
f460: 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28  >noSync );.  if(
f470: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
f480: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
f490: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
f4a0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
f4b0: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
f4c0: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
f4d0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
f4e0: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
f4f0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
f500: 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28    ){.    memcpy(
f510: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
f520: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
f530: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
f540: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
f550: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f560: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
f570: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
f580: 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  lse{.    memset(
f590: 7a 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65  zHeader, 0, size
f5a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f5b0: 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )+4);.  }..  /* 
f5c0: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
f5d0: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65  -hash initialize
f5e0: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
f5f0: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
f600: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
f610: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
f620: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
f630: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f640: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f650: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
f660: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
f670: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
f680: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
f690: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f6a0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f6b0: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
f6c0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
f6d0: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
f6e0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
f6f0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
f700: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
f710: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f720: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f730: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
f740: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
f750: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
f760: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
f770: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f780: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c  urnalMagic)+16],
f790: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f7a0: 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  e);..  /* Initia
f7b0: 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20  lizing the tail 
f7c0: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73  of the buffer is
f7d0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
f7e0: 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a   Everything.  **
f7f0: 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74   works find if t
f800: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d  he following mem
f810: 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64  set() is omitted
f820: 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a  .  But initializ
f830: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d  ing.  ** the mem
f840: 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c  ory prevents val
f850: 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c  grind from compl
f860: 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72  aining, so we ar
f870: 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a  e willing to.  *
f880: 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f  * take the perfo
f890: 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f  rmance hit..  */
f8a0: 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64  .  memset(&zHead
f8b0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
f8c0: 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c  alMagic)+20], 0,
f8d0: 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65  .         nHeade
f8e0: 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  r-(sizeof(aJourn
f8f0: 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a  alMagic)+20));..
f900: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
f910: 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73  it is only neces
f920: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68  sary to write th
f930: 65 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20  e 28 bytes that 
f940: 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  the .  ** journa
f950: 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65  l header consume
f960: 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s to the journal
f970: 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e   file here. Then
f980: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   increment the .
f990: 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e    ** Pager.journ
f9a0: 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62  alOff variable b
f9b0: 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  y JOURNAL_HDR_SZ
f9c0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
f9d0: 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69  t .  ** record i
f9e0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
f9f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f   following secto
fa00: 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70  r (leaving a gap
fa10: 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a   in the file.  *
fa20: 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  * that will be i
fa30: 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64  mplicitly filled
fa40: 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a   in by the OS)..
fa50: 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65    **.  ** Howeve
fa60: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69  r it has been di
fa70: 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e  scovered that on
fa80: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68   some systems th
fa90: 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a  is pattern can .
faa0: 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63    ** be signific
fab0: 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61  antly slower tha
fac0: 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77  n contiguously w
fad0: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
fae0: 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76  he file,.  ** ev
faf0: 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
fb00: 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74   explicitly writ
fb10: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
fb20: 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28  block of .  ** (
fb30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
fb40: 20 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20   28) bytes that 
fb50: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64  will not be used
fb60: 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61  . So that is wha
fb70: 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20  t.  ** is done. 
fb80: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c  .  **.  ** The l
fb90: 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20  oop is required 
fba0: 68 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65  here in case the
fbb0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20   sector-size is 
fbc0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
fbd0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70  .  ** database p
fbe0: 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20  age size. Since 
fbf0: 74 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66  the zHeader buff
fc00: 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72  er is only Pager
fc10: 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62  .pageSize.  ** b
fc20: 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f  ytes in size, mo
fc30: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c  re than one call
fc40: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69   to sqlite3OsWri
fc50: 74 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75  te() may be requ
fc60: 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70  ired.  ** to pop
fc70: 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65  ulate the entire
fc80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fc90: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20  sector..  */ .  
fca0: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
fcb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
fcc0: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
fcd0: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
fce0: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
fcf0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
fd00: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
fd10: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
fd20: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
fd30: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
fd40: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
fd50: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
fd60: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
fd70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
fd80: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
fd90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
fda0: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
fdb0: 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50  nalOff );.    pP
fdc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
fdd0: 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d   += nHeader;.  }
fde0: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
fdf0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
fe00: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
fe10: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
fe20: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
fe30: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
fe40: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
fe50: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
fe60: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
fe70: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
fe80: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
fe90: 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74  ile. The current
fea0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
feb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
fec0: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61   given by.** pPa
fed0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e  ger->journalOff.
fee0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
fef0: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
ff00: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
ff10: 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74  or.** a descript
ff20: 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
ff30: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
ff40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
ff50: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
ff60: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52  ccessfully, *pNR
ff70: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
ff80: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
ff90: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
ffa0: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
ffb0: 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73   and *pDbSize is
ffc0: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
ffd0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
ffe0: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
fff0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
10000 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
10010 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
10020 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
10030 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
10040 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10050 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
10060 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
10070 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
10080 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
10090 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
100a0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
100b0 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
100c0 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
100d0 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20  rned and *pNRec 
100e0 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65  and *PDbSize are
100f0 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20   undefined.  If 
10100 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
10110 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
10120 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
10130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
10140 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
10150 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
10160 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
10170 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
10180 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
10190 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
101a0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ject */.  int is
101b0 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e  Hot,.  i64 journ
101c0 61 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  alSize,         
101d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
101e0 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  he open journal 
101f0 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
10200 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20  .  u32 *pNRec,  
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65  /* OUT: Value re
10230 61 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63  ad from the nRec
10240 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20   field */.  u32 
10250 2a 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20  *pDbSize        
10260 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
10270 20 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e   Value of origin
10280 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
10290 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69   field */.){.  i
102a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
102b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
102c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
102d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
102e0 61 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20  agic[8];     /* 
102f0 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
10300 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
10310 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f  r */.  i64 iHdrO
10320 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
10330 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
10340 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
10350 62 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20  being read */.. 
10360 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
10370 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
10380 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
10390 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
103a0 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61  n. */..  /* Adva
103b0 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  nce Pager.journa
103c0 6c 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72  lOff to the star
103d0 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65  t of the next se
103e0 63 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a  ctor. If the.  *
103f0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
10400 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20  s too small for 
10410 74 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65  there to be a he
10420 61 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74  ader stored at t
10430 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20  his.  ** point, 
10440 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10450 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  NE..  */.  pPage
10460 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10470 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10480 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
10490 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
104a0 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
104b0 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
104c0 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
104d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
104e0 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66  E;.  }.  iHdrOff
104f0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
10500 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61  alOff;..  /* Rea
10510 64 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38  d in the first 8
10520 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
10530 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66  urnal header. If
10540 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74   they do not mat
10550 63 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67  ch.  ** the  mag
10560 69 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20  ic string found 
10570 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
10580 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61  each journal hea
10590 64 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  der, return.  **
105a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66   SQLITE_DONE. If
105b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
105c0 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65  urs, return an e
105d0 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72  rror code. Other
105e0 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65  wise,.  ** proce
105f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
10600 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21  sHot || iHdrOff!
10610 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
10620 48 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Hdr ){.    rc = 
10630 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
10640 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
10650 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
10660 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20  ), iHdrOff);.   
10670 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10680 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10690 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  }.    if( memcmp
106a0 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
106b0 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
106c0 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
106d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
106e0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
106f0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  }..  /* Read the
10700 20 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d   first three 32-
10710 62 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  bit fields of th
10720 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10730 3a 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20  : The nRec.  ** 
10740 66 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b  field, the check
10750 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20  sum-initializer 
10760 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
10770 20 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61   size at the sta
10780 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  rt.  ** of the t
10790 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75  ransaction. Retu
107a0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
107b0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
107c0 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20  s wrong..  */.  
107d0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
107e0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
107f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10800 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a  rOff+8, pNRec)).
10810 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
10820 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
10830 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10840 48 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67  HdrOff+12, &pPag
10850 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a  er->cksumInit)).
10860 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
10870 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
10880 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10890 48 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69  HdrOff+16, pDbSi
108a0 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  ze)).  ){.    re
108b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
108c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
108d0 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
108e0 20 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20   u32 iPageSize; 
108f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10900 20 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   Page-size field
10910 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
10920 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53  er */.    u32 iS
10930 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
10940 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72         /* Sector
10950 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a  -size field of j
10960 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
10970 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
10980 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
10990 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72  sector-size jour
109a0 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64  nal header field
109b0 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51  s. */.    if( SQ
109c0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
109d0 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
109e0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
109f0 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29  0, &iSectorSize)
10a00 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45  ).     || SQLITE
10a10 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
10a20 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10a30 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26  d, iHdrOff+24, &
10a40 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20  iPageSize)).    
10a50 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10a60 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
10a70 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  * Versions of SQ
10a80 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e  Lite prior to 3.
10a90 35 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65  5.8 set the page
10aa0 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
10ab0 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
10ac0 6c 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f  l header to zero
10ad0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
10ae0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
10af0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
10b00 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69     ** variable i
10b10 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
10b20 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
10b30 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  e size..    */. 
10b40 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65     if( iPageSize
10b50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61  ==0 ){.      iPa
10b60 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
10b70 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
10b80 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
10b90 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72  hat the values r
10ba0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
10bb0 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
10bc0 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20  r-size fields.  
10bd0 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20    ** are within 
10be0 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e  range. To be 'in
10bf0 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61   range', both va
10c00 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  lues need to be 
10c10 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f  a power.    ** o
10c20 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
10c30 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35  an or equal to 5
10c40 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f  12 or 32, and no
10c50 74 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  t greater than t
10c60 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73  heir .    ** res
10c70 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20  pective compile 
10c80 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d  time maximum lim
10c90 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  its..    */.    
10ca0 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31  if( iPageSize<51
10cb0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
10cc0 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a     || iSectorSiz
10cd0 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61  e<32.     || iPa
10ce0 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
10cf0 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69  X_PAGE_SIZE || i
10d00 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53  SectorSize>MAX_S
10d10 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20  ECTOR_SIZE.     
10d20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31  || ((iPageSize-1
10d30 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20  )&iPageSize)!=0 
10d40 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69    || ((iSectorSi
10d50 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a  ze-1)&iSectorSiz
10d60 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)!=0 .    ){.  
10d70 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69      /* If the ei
10d80 74 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69  ther the page-si
10d90 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a  ze or sector-siz
10da0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
10db0 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20  -header is .    
10dc0 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68    ** invalid, th
10dd0 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  en the process t
10de0 68 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f  hat wrote the jo
10df0 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73  urnal-header mus
10e00 74 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a  t have .      **
10e10 20 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20   crashed before 
10e20 74 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73  the header was s
10e30 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63  ynced. In this c
10e40 61 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ase stop reading
10e50 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a   .      ** the j
10e60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
10e70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10e90 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
10ea0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61  /* Update the pa
10eb0 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  ge-size to match
10ec0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
10ed0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
10ee0 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20  . .    ** Use a 
10ef0 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
10f00 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
10f10 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  at malloc failur
10f20 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a  e within .    **
10f30 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a   PagerSetPagesiz
10f40 65 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20  e() is tested.. 
10f50 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
10f60 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
10f70 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
10f80 69 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a  iPageSize, -1);.
10f90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
10fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  !=SQLITE_OK );..
10fb0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10fc0 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
10fd0 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
10fe0 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
10ff0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f   .    ** the pro
11000 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
11010 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
11020 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
11030 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  was.    ** creat
11040 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
11050 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
11060 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
11070 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73  outine.    ** is
11080 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72   being called fr
11090 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  om within pager_
110a0 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20  playback(). The 
110b0 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20  local value.    
110c0 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
110d0 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
110e0 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
110f0 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
11100 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
11110 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69  ->sectorSize = i
11120 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a  SectorSize;.  }.
11130 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11140 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
11150 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
11160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11170 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
11180 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
11190 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
111a0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
111b0 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
111c0 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
111d0 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
111e0 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
111f0 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
11200 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
11210 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
11220 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
11230 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11240 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
11250 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
11260 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11270 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
11280 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
11290 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
112a0 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
112b0 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
112c0 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b  at is:.**.**   +
112d0 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
112e0 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20  MJ_PGNO..**   + 
112f0 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  N bytes: Master 
11300 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
11310 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20   in utf-8..**   
11320 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65  + 4 bytes: N (le
11330 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a  ngth of master j
11340 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62  ournal name in b
11350 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72  ytes, no nul-ter
11360 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b  minator)..**   +
11370 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
11380 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
11390 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38  ecksum..**   + 8
113a0 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
113b0 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
113c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
113d0 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
113e0 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
113f0 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
11400 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
11410 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63   name, where eac
11420 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
11430 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65  reted as a signe
11440 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e  d 8-bit integer.
11450 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65  .**.** If zMaste
11460 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  r is a NULL poin
11470 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20  ter (occurs for 
11480 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
11490 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  e transaction), 
114a0 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73  .** this call is
114b0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
114c0 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
114d0 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
114e0 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
114f0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
11500 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
11510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11520 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
11530 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
11540 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
11550 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
11560 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73  h of string zMas
11570 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  ter */.  i64 iHd
11580 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
11590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
115a0 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e  set of header in
115b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
115c0 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a      /* Size of j
115f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64  ournal file on d
11600 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  isk */.  u32 cks
11610 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  um = 0;         
11620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
11630 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20  cksum of string 
11640 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73  zMaster */..  as
11650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
11660 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
11670 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
11680 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
11690 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
116a0 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
116b0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
116c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
116d0 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f  MORY .   || !isO
116e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
116f0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
11700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11710 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
11720 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  ter = 1;.  asser
11730 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
11740 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d  alHdr <= pPager-
11750 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a  >journalOff );..
11760 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74    /* Calculate t
11770 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74  he length in byt
11780 65 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b  es and the check
11790 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a  sum of zMaster *
117a0 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d  /.  for(nMaster=
117b0 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  0; zMaster[nMast
117c0 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b  er]; nMaster++){
117d0 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d  .    cksum += zM
117e0 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a  aster[nMaster];.
117f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
11800 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
11810 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
11820 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
11830 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
11840 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
11850 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
11860 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
11870 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
11880 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
11890 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
118a0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
118b0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
118c0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
118d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
118e0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
118f0 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
11900 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72  ger);.  }.  iHdr
11910 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
11920 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
11930 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
11940 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f   journal data to
11950 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11960 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
11970 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f  .  ** an error o
11980 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68  ccurs, return th
11990 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
119a0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f  the caller..  */
119b0 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63  .  if( (0 != (rc
119c0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
119d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
119e0 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47  Off, PAGER_MJ_PG
119f0 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20  NO(pPager)))).  
11a00 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11a10 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11a20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
11a30 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48  ter, nMaster, iH
11a40 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c  drOff+4))).   ||
11a50 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
11a60 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
11a70 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b  >jfd, iHdrOff+4+
11a80 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  nMaster, nMaster
11a90 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
11aa0 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
11ab0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
11ac0 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
11ad0 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20  +4, cksum))).   
11ae0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
11af0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
11b00 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
11b10 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20  nalMagic, 8,.   
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48                iH
11b40 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
11b50 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  8))).  ){.    re
11b60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
11b70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11b80 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30  f += (nMaster+20
11b90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
11ba0 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69  pager is in peri
11bb0 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  stent-journal mo
11bc0 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79  de, then the phy
11bd0 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72  sical .  ** jour
11be0 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74  nal-file may ext
11bf0 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
11c00 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
11c10 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a  ournal name.  **
11c20 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20   and 8 bytes of 
11c30 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20  magic data just 
11c40 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
11c50 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20  ile. This is .  
11c60 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63  ** dangerous bec
11c70 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f  ause the code to
11c80 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d   rollback a hot-
11c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
11ca0 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  * will not be ab
11cb0 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  le to find the m
11cc0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
11cd0 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
11ce0 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
11cf0 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
11d00 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20   is hot. .  **. 
11d10 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e   ** Easiest thin
11d20 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20  g to do in this 
11d30 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74  scenario is to t
11d40 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
11d50 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74  nal .  ** file t
11d60 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73  o the required s
11d70 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ize..  */ .  if(
11d80 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
11d90 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
11da0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
11db0 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20   &jrnlSize)).   
11dc0 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67  && jrnlSize>pPag
11dd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
11de0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11df0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
11e00 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
11e10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
11e20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
11e40 72 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  rd the entire co
11e50 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e  ntents of the in
11e60 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63  -memory page-cac
11e70 68 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  he..*/.static vo
11e80 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
11e90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11ea0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11eb0 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74  rsion++;.  sqlit
11ec0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
11ed0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
11ee0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
11ef0 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
11f00 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
11f10 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61  * Return the pPa
11f20 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11f30 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73  n value.*/.u32 s
11f40 71 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56  qlite3PagerDataV
11f50 65 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  ersion(Pager *pP
11f60 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
11f70 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11f80 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  sion;.}../*.** F
11f90 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
11fa0 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
11fb0 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
11fc0 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
11fd0 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
11fe0 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
11ff0 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
12000 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
12010 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
12020 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
12030 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
12040 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
12050 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12060 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
12070 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
12080 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
12090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
120a0 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
120b0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
120c0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
120d0 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
120e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
120f0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
12100 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
12110 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
12120 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
12130 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
12140 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
12150 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71  lusiveMode || sq
12160 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e  lite3JournalIsIn
12170 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73  Memory(pPager->s
12180 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  jfd) ){.    sqli
12190 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
121a0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  r->sjfd);.  }.  
121b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
121c0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29  ger->aSavepoint)
121d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76  ;.  pPager->aSav
121e0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
121f0 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
12200 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
12210 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a  nSubRec = 0;.}..
12220 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69  /*.** Set the bi
12230 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  t number pgno in
12240 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
12250 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
12260 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20   .** bitvecs of 
12270 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  all open savepoi
12280 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  nts. Return SQLI
12290 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
122a0 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  ful.** or SQLITE
122b0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
122c0 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
122d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
122e0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
122f0 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
12300 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
12310 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12330 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
12340 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12350 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20  TE_OK;       /* 
12360 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a  Result code */..
12370 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
12380 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
12390 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61  t; ii++){.    Pa
123a0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
123b0 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
123c0 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69  point[ii];.    i
123d0 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69  f( pgno<=p->nOri
123e0 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d  g ){.      rc |=
123f0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
12400 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
12410 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
12420 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
12430 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
12440 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
12450 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
12460 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
12470 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12480 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
12490 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
124a0 4f 4e 43 55 52 52 45 4e 54 0a 2f 2a 0a 2a 2a 20  ONCURRENT./*.** 
124b0 49 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  If they are not 
124c0 61 6c 72 65 61 64 79 2c 20 62 65 67 69 6e 20 72  already, begin r
124d0 65 63 6f 72 64 69 6e 67 20 61 6c 6c 20 70 61 67  ecording all pag
124e0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
124f0 20 70 61 67 65 72 20 6c 61 79 65 72 0a 2a 2a 20   pager layer.** 
12500 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
12510 79 65 72 20 54 68 69 73 20 69 73 20 75 73 65 64  yer This is used
12520 20 62 79 20 63 6f 6e 63 75 72 72 65 6e 74 20 74   by concurrent t
12530 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 52 65 74  ransactions. Ret
12540 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
12550 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
12560 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
12570 6f 72 20 63 6f 64 65 20 28 53 51 4c 49 54 45 5f  or code (SQLITE_
12580 4e 4f 4d 45 4d 29 20 69 66 20 61 6e 20 65 72 72  NOMEM) if an err
12590 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  or.** occurs..*/
125a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
125b0 72 42 65 67 69 6e 43 6f 6e 63 75 72 72 65 6e 74  rBeginConcurrent
125c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
125d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
125e0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
125f0 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 3d 3d 30  ger->pAllRead==0
12600 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12610 70 41 6c 6c 52 65 61 64 20 3d 20 73 71 6c 69 74  pAllRead = sqlit
12620 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
12630 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
12640 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72      pPager->dbOr
12650 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  igSize = pPager-
12660 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  >dbSize;.    if(
12670 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
12680 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  d==0 ){.      rc
12690 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
126a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
126b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 21 64  urn rc;.}../* !d
126c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
126d0 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54 29 0a 2a  IT_CONCURRENT).*
126e0 2a 0a 2a 2a 20 53 74 6f 70 20 72 65 63 6f 72 64  *.** Stop record
126f0 69 6e 67 20 61 6c 6c 20 70 61 67 65 73 20 72 65  ing all pages re
12700 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
12710 72 20 6c 61 79 65 72 20 62 79 20 74 68 65 20 62  r layer by the b
12720 2d 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 61  -tree layer.** a
12730 6e 64 20 64 69 73 63 61 72 64 20 61 6e 79 20 63  nd discard any c
12740 75 72 72 65 6e 74 20 72 65 63 6f 72 64 73 2e 0a  urrent records..
12750 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
12760 61 67 65 72 45 6e 64 43 6f 6e 63 75 72 72 65 6e  agerEndConcurren
12770 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
12780 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  {.  sqlite3Bitve
12790 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
127a0 3e 70 41 6c 6c 52 65 61 64 29 3b 0a 20 20 70 50  >pAllRead);.  pP
127b0 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61 64 20 3d  ager->pAllRead =
127c0 20 30 3b 0a 7d 0a 0a 2f 2a 20 21 64 65 66 69 6e   0;.}../* !defin
127d0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
127e0 4f 4e 43 55 52 52 45 4e 54 29 0a 2a 2a 0a 2a 2a  ONCURRENT).**.**
127f0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
12800 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
12810 69 6e 20 77 61 6c 20 6d 6f 64 65 2e 20 46 61 6c  in wal mode. Fal
12820 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
12830 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12840 72 49 73 57 61 6c 28 50 61 67 65 72 20 2a 70 50  rIsWal(Pager *pP
12850 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
12860 70 50 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 3b  pPager->pWal!=0;
12870 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
12880 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52  ITE_OMIT_CONCURR
12890 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 72  ENT */../*.** Fr
128a0 65 65 20 74 68 65 20 50 61 67 65 72 2e 70 49 6e  ee the Pager.pIn
128b0 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 61 67 65  Journal and Page
128c0 72 2e 70 41 6c 6c 52 65 61 64 20 62 69 74 76 65  r.pAllRead bitve
128d0 63 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74  c objects..*/.st
128e0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
128f0 72 65 65 42 69 74 76 65 63 73 28 50 61 67 65 72  reeBitvecs(Pager
12900 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
12910 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
12920 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
12930 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
12940 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
12950 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 45  .  sqlite3PagerE
12960 6e 64 43 6f 6e 63 75 72 72 65 6e 74 28 70 50 61  ndConcurrent(pPa
12970 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ger);.}../*.** T
12980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12990 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70  a no-op if the p
129a0 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
129b0 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f  sive mode and no
129c0 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f  t.** in the ERRO
129d0 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  R state. Otherwi
129e0 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20  se, it switches 
129f0 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47  the pager to PAG
12a00 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65  ER_OPEN.** state
12a10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
12a20 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65  ager is not in e
12a30 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
12a40 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61  mode, the databa
12a50 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f  se file is.** co
12a60 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65  mpletely unlocke
12a70 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  d. If the file i
12a80 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74  s unlocked and t
12a90 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  he file-system d
12aa0 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62  oes.** not exhib
12ab0 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42  it the UNDELETAB
12ac0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f  LE_WHEN_OPEN pro
12ad0 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e  perty, the journ
12ae0 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c  al file is.** cl
12af0 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f  osed (if it is o
12b00 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pen)..**.** If t
12b10 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45  he pager is in E
12b20 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20  RROR state when 
12b30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12b40 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a   called, the .**
12b50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
12b60 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65   pager cache are
12b70 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72   discarded befor
12b80 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b  e switching back
12b90 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e   to .** the OPEN
12ba0 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65   state. Regardle
12bb0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
12bc0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
12bd0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20  clusive-mode.** 
12be0 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72  or not, any jour
12bf0 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e  nal file left in
12c00 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
12c10 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
12c20 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  .** as a hot-jou
12c30 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
12c40 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69  back the next ti
12c50 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  me a read-transa
12c60 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e  ction.** is open
12c70 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62  ed (by this or b
12c80 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e  y any other conn
12c90 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74  ection)..*/.stat
12ca0 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
12cb0 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
12cc0 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  er){..  assert( 
12cd0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
12ce0 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
12cf0 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
12d00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
12d10 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  EN .       || pP
12d20 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
12d30 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a  GER_ERROR .  );.
12d40 0a 20 20 70 61 67 65 72 46 72 65 65 42 69 74 76  .  pagerFreeBitv
12d50 65 63 73 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ecs(pPager);.  r
12d60 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
12d70 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
12d80 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
12d90 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
12da0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
12db0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
12dc0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64     sqlite3WalEnd
12dd0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
12de0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
12df0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12e00 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12e10 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
12e20 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
12e30 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
12e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12e50 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
12e60 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62   code returned b
12e70 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  y pagerUnlockDb(
12e80 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63  ) */.    int iDc
12e90 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72   = isOpen(pPager
12ea0 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44  ->fd)?sqlite3OsD
12eb0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
12ec0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
12ed0 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  :0;..    /* If t
12ee0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
12ef0 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65  tem support dele
12f00 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c  tion of open fil
12f10 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  es, then.    ** 
12f20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
12f30 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
12f40 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
12f50 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69  e lock.  Otherwi
12f60 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65  se.    ** anothe
12f70 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
12f80 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
12f90 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65  elete might dele
12fa0 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  te the file.    
12fb0 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ** out from unde
12fc0 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
12fd0 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12fe0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
12ff0 52 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  RY   & 5)!=1 );.
13000 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
13010 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
13020 46 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  FF      & 5)!=1 
13030 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
13040 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
13050 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21  E_WAL      & 5)!
13060 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
13070 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
13080 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20  MODE_DELETE   & 
13090 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
130a0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
130b0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
130c0 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
130d0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
130e0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
130f0 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ST  & 5)==1 );. 
13100 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26     if( 0==(iDc &
13110 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
13120 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
13130 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d  PEN).     || 1!=
13140 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
13150 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b  Mode & 5).    ){
13160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
13170 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
13180 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
13190 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
131a0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
131b0 74 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c  tate and the cal
131c0 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  l to unlock the 
131d0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
131e0 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20  file fails, set 
131f0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
13200 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
13210 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
13220 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74  t.    ** above t
13230 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55  he #define for U
13240 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
13250 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
13260 66 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a  f why this.    *
13270 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  * is necessary..
13280 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
13290 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
132a0 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ager, NO_LOCK);.
132b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
132c0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
132d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
132e0 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50  RROR ){.      pP
132f0 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e  ager->eLock = UN
13300 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20  KNOWN_LOCK;.    
13310 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  }..    /* The pa
13320 67 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65  ger state may be
13330 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41   changed from PA
13340 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47  GER_ERROR to PAG
13350 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20  ER_OPEN here.   
13360 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61   ** without clea
13370 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63  ring the error c
13380 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74  ode. This is int
13390 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65  entional - the e
133a0 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  rror.    ** code
133b0 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20   is cleared and 
133c0 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20  the cache reset 
133d0 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c  in the block bel
133e0 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
133f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
13400 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  rrCode || pPager
13410 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
13420 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61  ERROR );.    pPa
13430 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
13440 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
13450 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
13460 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a  AGER_OPEN;.  }..
13470 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
13480 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
13490 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
134a0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
134b0 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75  nnot be.  ** tru
134c0 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
134d0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
134e0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
134f0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c  es to the pager,
13500 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66  .  ** it can saf
13510 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f  ely move back to
13520 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
13530 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  e. This happens 
13540 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72  in both.  ** nor
13550 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76  mal and exclusiv
13560 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  e-locking mode..
13570 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
13580 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
13590 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
135a0 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
135b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
135c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
135d0 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  tempFile==0 ){. 
135e0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
135f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
13600 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
13610 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
13620 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
13630 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
13640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13650 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
13660 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  = (isOpen(pPager
13670 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f  ->jfd) ? PAGER_O
13680 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44  PEN : PAGER_READ
13690 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
136a0 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
136b0 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
136c0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
136d0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  d, 0, 0);.    pP
136e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
136f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73  SQLITE_OK;.    s
13700 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
13710 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70  Pager);.  }..  p
13720 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13730 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
13740 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
13750 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
13760 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
13770 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13780 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
13790 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
137a0 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
137b0 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
137c0 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
137d0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
137e0 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
137f0 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
13800 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
13810 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
13820 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
13830 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
13840 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
13850 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
13860 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
13870 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
13880 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
13890 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
138a0 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
138b0 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
138c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
138d0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
138e0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
138f0 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
13900 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
13910 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
13920 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
13930 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
13940 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
13950 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
13960 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
13970 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
13980 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
13990 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
139a0 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
139b0 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
139c0 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
139d0 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
139e0 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
139f0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
13a00 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
13a10 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
13a20 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
13a30 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
13a40 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
13a50 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
13a60 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
13a70 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
13a80 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
13a90 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
13aa0 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
13ab0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
13ac0 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
13ad0 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
13ae0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
13af0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
13b00 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
13b10 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
13b20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
13b30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
13b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
13b50 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
13b60 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
13b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13b80 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
13b90 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
13ba0 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
13bb0 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
13bc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13bd0 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
13be0 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
13bf0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
13c00 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
13c10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
13c20 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
13c30 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
13c40 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
13c50 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
13c60 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
13c70 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
13c80 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
13c90 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
13ca0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
13cb0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
13cc0 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
13cd0 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
13ce0 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
13cf0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13d00 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
13d10 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
13d20 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
13d30 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
13d40 68 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  he write transac
13d50 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61  tion open on pPa
13d60 67 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ger is being com
13d70 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d  mitted (bCommit=
13d80 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64  =1).** or rolled
13d90 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d   back (bCommit==
13da0 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  0)..**.** Return
13db0 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c   TRUE if and onl
13dc0 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70  y if all dirty p
13dd0 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66  ages should be f
13de0 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a  lushed to disk..
13df0 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a  **.** Rules:.**.
13e00 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d  **   *  For non-
13e10 54 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20  TEMP databases, 
13e20 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64  always sync to d
13e30 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  isk.  This is ne
13e40 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20  cessary.**      
13e50 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  for transactions
13e60 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a   to be durable..
13e70 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20  **.**   *  Sync 
13e80 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e  TEMP database on
13e90 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28  ly on a COMMIT (
13ea0 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20  not a ROLLBACK) 
13eb0 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67  when the backing
13ec0 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61  .**      file ha
13ed0 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61  s been created a
13ee0 6c 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70  lready (via a sp
13ef0 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65  ill on pagerStre
13f00 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20  ss()) and.**    
13f10 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65    when the numbe
13f20 72 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  r of dirty pages
13f30 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65   in memory excee
13f40 64 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f  ds 25% of the to
13f50 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68  tal.**      cach
13f60 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  e size..*/.stati
13f70 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68  c int pagerFlush
13f80 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  OnCommit(Pager *
13f90 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d  pPager, int bCom
13fa0 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67  mit){.  if( pPag
13fb0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
13fc0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
13fd0 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74  ( !bCommit ) ret
13fe0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73  urn 0;.  if( !is
13ff0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
14000 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
14010 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43  eturn (sqlite3PC
14020 61 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79  achePercentDirty
14030 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14040 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )>=25);.}../*.**
14050 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
14060 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
14070 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
14080 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
14090 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
140a0 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
140b0 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
140c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
140d0 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
140e0 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
140f0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
14100 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
14110 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
14120 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
14130 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
14140 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
14150 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
14160 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
14170 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
14180 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
14190 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
141a0 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
141b0 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
141c0 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
141d0 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
141e0 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
141f0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
14200 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
14210 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
14220 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
14230 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
14240 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
14250 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
14260 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
14270 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
14280 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
14290 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
142a0 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
142b0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
142c0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
142d0 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
142e0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
142f0 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
14300 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
14310 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
14320 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
14330 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
14340 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
14350 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
14360 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
14370 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
14380 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
14390 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
143a0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
143b0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
143c0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
143d0 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
143e0 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
143f0 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
14400 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
14410 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
14420 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
14430 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
14440 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
14450 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
14460 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
14470 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
14480 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
14490 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
144a0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
144b0 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
144c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
144d0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
144e0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
144f0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
14500 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
14510 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
14520 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
14530 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
14540 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
14550 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
14560 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
14570 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
14580 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
14590 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
145a0 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
145b0 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
145c0 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
145d0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
145e0 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
145f0 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
14600 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
14610 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
14620 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
14630 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
14640 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
14650 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
14660 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
14670 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
14680 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
14690 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
146a0 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
146b0 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
146c0 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
146d0 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
146e0 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
146f0 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
14700 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
14710 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
14720 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
14730 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
14740 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
14750 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
14760 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
14770 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
14780 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
14790 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
147a0 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
147b0 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
147c0 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
147d0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
147e0 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
147f0 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
14800 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
14810 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
14820 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
14830 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14840 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
14850 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
14860 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
14870 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
14880 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
14890 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
148a0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
148b0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
148c0 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
148d0 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
148e0 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
148f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14900 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
14910 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
14920 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
14930 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14940 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
14950 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
14960 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
14970 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
14980 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
14990 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
149a0 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
149b0 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
149c0 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
149d0 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
149e0 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
149f0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
14a00 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
14a10 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
14a20 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
14a30 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f  sMaster, int bCo
14a40 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  mmit){.  int rc 
14a50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
14a60 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
14a70 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  from journal fin
14a80 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74  alization operat
14a90 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ion */.  int rc2
14aa0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14ab0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
14ac0 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c  from db file unl
14ad0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ock operation */
14ae0 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  ..  /* Do nothin
14af0 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64  g if the pager d
14b00 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
14b10 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
14b20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61  action.  ** or a
14b30 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
14b40 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75  ED lock. This fu
14b50 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
14b60 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a  lled when there.
14b70 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65    ** is no write
14b80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
14b90 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56  ive but a RESERV
14ba0 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
14bb0 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20  ck is.  ** held 
14bc0 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d  under two circum
14bd0 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20  stances:.  **.  
14be0 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20  **   1. After a 
14bf0 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a  successful hot-j
14c00 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
14c10 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69   it is called wi
14c20 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74  th.  **      eSt
14c30 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20  ate==PAGER_NONE 
14c40 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
14c50 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a  SIVE_LOCK..  **.
14c60 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63    **   2. If a c
14c70 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c  onnection with l
14c80 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14c90 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e  usive holding an
14ca0 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a   EXCLUSIVE .  **
14cb0 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63        lock switc
14cc0 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b  hes back to lock
14cd0 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20  ing_mode=normal 
14ce0 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65  and then execute
14cf0 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65  s a.  **      re
14d00 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ad-transaction, 
14d10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
14d20 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74   called with eSt
14d30 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
14d40 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64  R .  **      and
14d50 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
14d60 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  E_LOCK when the 
14d70 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
14d80 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f   is closed..  */
14d90 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
14da0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14db0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
14dc0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
14dd0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
14de0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14df0 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49  eState<PAGER_WRI
14e00 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50  TER_LOCKED && pP
14e10 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45  ager->eLock<RESE
14e20 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
14e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14e40 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73  K;.  }..  releas
14e50 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
14e60 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
14e70 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
14e80 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
14e90 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a  >pInJournal==0 .
14ea0 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65        || (sqlite
14eb0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
14ec0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
14ed0 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
14ee0 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a  P_BATCH_ATOMIC).
14ef0 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65    );.  if( isOpe
14f00 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
14f10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
14f20 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
14f30 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
14f40 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
14f50 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
14f60 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
14f70 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14f80 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
14f90 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
14fa0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14fb0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14fc0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a  MODE_MEMORY ); *
14fd0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
14fe0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14ff0 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
15000 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
15010 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
15020 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
15030 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
15040 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15050 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
15060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15070 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15080 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15090 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
150a0 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
150b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
150c0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
150d0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
150e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
150f0 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69   sure the new fi
15100 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74  le size is writt
15110 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64  en into the inod
15120 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  e right away..  
15130 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
15140 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wise the journal
15150 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74   might resurrect
15160 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
15170 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20  er loss and.    
15180 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
15190 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74  he last transact
151a0 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ion to roll back
151b0 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20  .  See.         
151c0 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a   ** https://bugz
151d0 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67  illa.mozilla.org
151e0 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
151f0 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20  =1072773.       
15200 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
15210 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
15220 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
15230 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
15240 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
15250 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
15260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
15270 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
15280 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
15290 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
152a0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
152b0 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
152c0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
152d0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
152e0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
152f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
15300 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
15310 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
15320 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
15330 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  er||pPager->temp
15340 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61  File);.      pPa
15350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
15360 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
15370 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
15380 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
15390 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
153a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
153b0 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
153c0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
153d0 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
153e0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
153f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
15400 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
15410 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
15420 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
15430 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
15440 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
15450 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15460 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
15470 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
15480 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ry journal..    
15490 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62    */.      int b
154a0 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72  Delete = !pPager
154b0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
154c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
154d0 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
154e0 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d  ry(pPager->jfd)=
154f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
15500 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
15510 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
15520 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
15530 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
15540 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15550 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
15560 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
15570 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
15580 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
15590 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
155a0 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
155b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
155c0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
155d0 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
155e0 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  bDelete ){.     
155f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
15600 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
15610 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
15620 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
15630 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20  extraSync);.    
15640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
15650 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
15660 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
15670 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
15680 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
15690 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
156a0 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
156b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
156c0 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
156d0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
156e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
156f0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
15700 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
15710 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  kup(pPager, 1);.
15720 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
15730 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d     p->pageHash =
15740 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
15750 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
15760 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ll(p);.    }.  }
15770 0a 23 65 6e 64 69 66 0a 0a 20 20 70 61 67 65 72  .#endif..  pager
15780 46 72 65 65 42 69 74 76 65 63 73 28 70 50 61 67  FreeBitvecs(pPag
15790 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  er);.  pPager->n
157a0 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Rec = 0;.  if( r
157b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
157c0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c      if( MEMDB ||
157d0 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d   pagerFlushOnCom
157e0 6d 69 74 28 70 50 61 67 65 72 2c 20 62 43 6f 6d  mit(pPager, bCom
157f0 6d 69 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  mit) ){.      sq
15800 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
15810 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61  All(pPager->pPCa
15820 63 68 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  che);.    }else{
15830 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
15840 61 63 68 65 43 6c 65 61 72 57 72 69 74 61 62 6c  acheClearWritabl
15850 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
15860 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
15870 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
15880 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
15890 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
158a0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
158b0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
158c0 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ger) ){.    /* D
158d0 72 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74  rop the WAL writ
158e0 65 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20  e-lock, if any. 
158f0 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e  Also, if the con
15900 6e 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a  nection was in .
15910 20 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d      ** locking_m
15920 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
15930 64 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e  de but is no lon
15940 67 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58  ger, drop the EX
15950 43 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20  CLUSIVE .    ** 
15960 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
15970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
15980 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d      */.    rc2 =
15990 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72   sqlite3WalEndWr
159a0 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  iteTransaction(p
159b0 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20  Pager->pWal);.  
159c0 20 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53    assert( rc2==S
159d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65  QLITE_OK );.  }e
159e0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
159f0 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74  TE_OK && bCommit
15a00 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69   && pPager->dbFi
15a10 6c 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64  leSize>pPager->d
15a20 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  bSize ){.    /* 
15a30 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
15a40 61 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74  aken when commit
15a50 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
15a60 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a  on in rollback-j
15a70 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f  ournal.    ** mo
15a80 64 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  de if the databa
15a90 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  se file on disk 
15aa0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
15ab0 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
15ac0 65 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69  e..    ** At thi
15ad0 73 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72  s point the jour
15ae0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e  nal has been fin
15af0 61 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74  alized and the t
15b00 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
15b10 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
15b20 63 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74  committed, but t
15b30 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  he EXCLUSIVE loc
15b40 6b 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20  k is still held 
15b50 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  on the.    ** fi
15b60 6c 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66  le. So it is saf
15b70 65 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  e to truncate th
15b80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15b90 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20  to its minimum. 
15ba0 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73     ** required s
15bb0 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ize.  */.    ass
15bc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
15bd0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
15be0 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  CK );.    rc = p
15bf0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
15c00 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ager, pPager->db
15c10 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Size);.  }..  if
15c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15c30 26 26 20 62 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  && bCommit ){.  
15c40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15c50 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
15c60 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
15c70 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53  CNTL_COMMIT_PHAS
15c80 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66  ETWO, 0);.    if
15c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
15ca0 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51 4c  FOUND ) rc = SQL
15cb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
15cc0 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
15cd0 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
15ce0 20 28 21 70 61 67 65 72 55 73 65 57 61 6c 28 70   (!pagerUseWal(p
15cf0 50 61 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65  Pager) || sqlite
15d00 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
15d10 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
15d20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32  0)).  ){.    rc2
15d30 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   = pagerUnlockDb
15d40 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
15d50 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
15d60 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
15d70 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ne = 0;.  }.  pP
15d80 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
15d90 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70  AGER_READER;.  p
15da0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
15db0 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
15dc0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
15dd0 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
15de0 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
15df0 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
15e00 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
15e10 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
15e20 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
15e30 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
15e40 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
15e50 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
15e60 4f 52 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  OR state, do not
15e70 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65   attempt .** the
15e80 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69   rollback at thi
15e90 73 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c  s time. Instead,
15ea0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
15eb0 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a  is called. The.*
15ec0 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
15ed0 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69  unlock() will di
15ee0 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d  scard all in-mem
15ef0 6f 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63  ory pages, unloc
15f00 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  k.** the databas
15f10 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20  e file and move 
15f20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
15f30 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66  o OPEN state. If
15f40 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20   this .** means 
15f50 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
15f60 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  hot-journal left
15f70 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
15f80 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a  tem, the next .*
15f90 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * connection to 
15fa0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
15fb0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65  lock on the page
15fc0 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20  r (which may be 
15fd0 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69  this one) .** wi
15fe0 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ll roll it back.
15ff0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
16000 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
16010 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
16020 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74  ERROR state, but
16030 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
16040 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
16050 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
16060 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
16070 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
16080 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
16090 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52   enter the ERROR
160a0 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
160b0 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
160c0 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
160d0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
160e0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
160f0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
16100 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
16110 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
16120 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
16130 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
16140 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70  PAGER_ERROR && p
16150 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
16160 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
16170 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
16180 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
16190 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  er) );.    if( p
161a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
161b0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
161c0 45 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ED ){.      sqli
161d0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
161e0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
161f0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
16200 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
16210 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
16220 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
16230 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
16240 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
16250 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
16260 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16270 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
16280 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e  ;.      pager_en
16290 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
162a0 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ager, 0, 0);.   
162b0 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75   }.  }.  pager_u
162c0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d  nlock(pPager);.}
162d0 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
162e0 72 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69  r aData must poi
162f0 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
16300 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  f pPager->pageSi
16310 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  ze bytes.** of d
16320 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64  ata. Compute and
16330 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
16340 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65  um based ont the
16350 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
16360 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74   .** page of dat
16370 61 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  a and the curren
16380 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65  t value of pPage
16390 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a  r->cksumInit..**
163a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
163b0 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e  a real checksum.
163c0 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
163d0 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
163e0 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
163f0 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67  tial value (pPag
16400 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61  er->cksumInit) a
16410 6e 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62  nd every 200th b
16420 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  yte.** of the pa
16430 67 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e  ge data, startin
16440 67 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73  g with byte offs
16450 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65  et (pPager->page
16460 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61  Size%200)..** Ea
16470 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
16480 70 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62  preted as an 8-b
16490 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  it unsigned inte
164a0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67  ger..**.** Chang
164b0 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20  ing the formula 
164c0 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
164d0 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65  this checksum re
164e0 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69  sults in an.** i
164f0 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72  ncompatible jour
16500 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  nal file format.
16510 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61  .**.** If journa
16520 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  l corruption occ
16530 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
16540 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
16550 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20  most likely .** 
16560 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74  scenario is that
16570 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
16580 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
16590 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
165a0 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d  ged. .** It is m
165b0 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
165c0 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
165d0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
165e0 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
165f0 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
16600 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
16610 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
16620 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
16630 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
16640 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
16650 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
16660 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
16670 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f  f corruption..*/
16680 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
16690 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
166a0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
166b0 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
166c0 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
166d0 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
166e0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61    /* Checksum va
166f0 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
16700 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65  .  int i = pPage
16710 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b  r->pageSize-200;
16720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
16730 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77  p counter */.  w
16740 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
16750 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
16760 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
16770 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
16780 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ksum;.}../*.** R
16790 65 70 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e  eport the curren
167a0 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
167b0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
167c0 65 64 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a  ed bytes back.**
167d0 20 74 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a   to the codec..*
167e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
167f0 48 41 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63  HAS_CODEC.static
16800 20 76 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72   void pagerRepor
16810 74 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  tSize(Pager *pPa
16820 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
16830 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68  er->xCodecSizeCh
16840 6e 67 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ng ){.    pPager
16850 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
16860 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c  (pPager->pCodec,
16870 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16880 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
168a0 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65  nt)pPager->nRese
168b0 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  rve);.  }.}.#els
168c0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  e.# define pager
168d0 52 65 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20  ReportSize(X)   
168e0 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65    /* No-op if we
168f0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
16900 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69  a codec */.#endi
16910 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
16920 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
16930 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
16940 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
16950 64 20 62 69 74 73 20 69 73 20 74 68 65 20 73 61  d bits is the sa
16960 6d 65 20 69 6e 20 74 68 65 20 64 65 73 74 69 6e  me in the destin
16970 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61  ation.** pager a
16980 73 20 69 74 20 69 73 20 69 6e 20 74 68 65 20 73  s it is in the s
16990 6f 75 72 63 65 2e 20 20 54 68 69 73 20 63 6f 6d  ource.  This com
169a0 65 73 20 75 70 20 77 68 65 6e 20 61 20 56 41 43  es up when a VAC
169b0 55 55 4d 20 63 68 61 6e 67 65 73 20 74 68 65 0a  UUM changes the.
169c0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  ** number of res
169d0 65 72 76 65 64 20 62 69 74 73 20 74 6f 20 74 68  erved bits to th
169e0 65 20 22 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75  e "optimal" amou
169f0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
16a00 74 65 33 50 61 67 65 72 41 6c 69 67 6e 52 65 73  te3PagerAlignRes
16a10 65 72 76 65 28 50 61 67 65 72 20 2a 70 44 65 73  erve(Pager *pDes
16a20 74 2c 20 50 61 67 65 72 20 2a 70 53 72 63 29 7b  t, Pager *pSrc){
16a30 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 6e 52  .  if( pDest->nR
16a40 65 73 65 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52  eserve!=pSrc->nR
16a50 65 73 65 72 76 65 20 29 7b 0a 20 20 20 20 70 44  eserve ){.    pD
16a60 65 73 74 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20  est->nReserve = 
16a70 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  pSrc->nReserve;.
16a80 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16a90 69 7a 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a  ize(pDest);.  }.
16aa0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16ab0 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
16ac0 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74  ge from either t
16ad0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16ae0 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
16af0 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68  1) or.** from th
16b00 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69  e sub-journal (i
16b10 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29  f isMainJrnl==0)
16b20 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68   and playback th
16b30 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20  at page..** The 
16b40 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f  page begins at o
16b50 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69  ffset *pOffset i
16b60 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68  nto the file. Th
16b70 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61  e *pOffset.** va
16b80 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65 64  lue is increased
16b90 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
16ba0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16bb0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
16bc0 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f  *.** The main ro
16bd0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
16be0 73 65 73 20 63 68 65 63 6b 73 75 6d 73 20 2d 20  ses checksums - 
16bf0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
16c00 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e  urnal does .** n
16c10 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ot..**.** If the
16c20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16c30 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20  the page record 
16c40 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
16c50 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
16c60 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
16c70 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
16c80 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
16c90 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79  bSize, then play
16ca0 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70  back is.** skipp
16cb0 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
16cc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
16cd0 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73 20  .** If pDone is 
16ce0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  not NULL, then i
16cf0 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f 66  t is a record of
16d00 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
16d10 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
16d20 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20 49   played back.  I
16d30 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a 70  f the page at *p
16d40 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65 61  Offset has alrea
16d50 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  dy been played b
16d60 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20 63  ack.** (if the c
16d70 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f  orresponding pDo
16d80 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20 74  ne bit is set) t
16d90 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c 61  hen skip the pla
16da0 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73  yback..** Make s
16db0 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62 69  ure the pDone bi
16dc0 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
16dd0 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74 20  to the *pOffset 
16de0 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20 70  page is set.** p
16df0 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69 6e  rior to returnin
16e00 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  g..**.** If the 
16e10 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20 73  page record is s
16e20 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64  uccessfully read
16e30 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
16e40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
16e50 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b 2c  and played back,
16e60 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
16e70 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
16e80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
16e90 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61 64  rs.** while read
16ea0 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20 66  ing the record f
16eb0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16ec0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 68  urnal file or wh
16ed0 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  ile writing.** t
16ee0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
16ef0 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  ile, then the IO
16f00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
16f10 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74 61  eturned. If data
16f20 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66 75  .** is successfu
16f30 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lly read from th
16f40 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
16f50 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72 73  file but appears
16f60 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70   to be.** corrup
16f70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
16f80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44 61   is returned. Da
16f90 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ta is considered
16fa0 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a   corrupted in.**
16fb0 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
16fc0 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49  es:.** .**   * I
16fd0 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61 67  f the record pag
16fe0 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c 65  e-number is ille
16ff0 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52 5f  gal (0 or PAGER_
17000 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20  MJ_PGNO), or.** 
17010 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
17020 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  d is being rolle
17030 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
17040 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
17050 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68 65  e.**     and the
17060 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64 20   checksum field 
17070 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
17080 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e  he record conten
17090 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72  t..**.** Neither
170a0 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73 63   of these two sc
170b0 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73 73  enarios are poss
170c0 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73 61  ible during a sa
170d0 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
170e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
170f0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  is a savepoint r
17100 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65  ollback, then me
17110 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74 6f  mory may have to
17120 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
17130 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ** allocated by 
17140 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
17150 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
17160 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61  se and an alloca
17170 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53  tion fails,.** S
17180 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
17190 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
171a0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
171b0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a  yback_one_page(.
171c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65 69  /* The pager bei
171f0 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  ng played back *
17200 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74  /.  i64 *pOffset
17210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17220 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
17230 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
17240 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  k */.  Bitvec *p
17250 44 6f 6e 65 2c 20 20 20 20 20 20 20 20 20 20 20  Done,           
17260 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
17270 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79 20  f pages already 
17280 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
17290 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c   int isMainJrnl,
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
172b0 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72  * 1 -> main jour
172c0 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f  nal. 0 -> sub-jo
172d0 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20  urnal. */.  int 
172e0 69 73 53 61 76 65 70 6e 74 20 20 20 20 20 20 20  isSavepnt       
172f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
17300 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e  e for a savepoin
17310 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b  t rollback */.){
17320 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
17330 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
17340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
17350 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
17360 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
17370 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17390 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
173a0 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
173b0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
173c0 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
173d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
173e0 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
173f0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
17400 2f 0a 20 20 63 68 61 72 20 2a 61 44 61 74 61 3b  /.  char *aData;
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73    /* Temporary s
17430 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65 20 70  torage for the p
17440 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  age */.  sqlite3
17450 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
17460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
17470 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
17480 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
17490 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79  le */.  int isSy
174a0 6e 63 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  nced;           
174b0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
174c0 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 73   journal page is
174d0 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69 66 64 65   synced */.#ifde
174e0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
174f0 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a 72 6e 6c  EC.  /* The jrnl
17500 45 6e 63 20 66 6c 61 67 20 69 73 20 74 72 75 65  Enc flag is true
17510 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70 61 67 65   if Journal page
17520 73 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  s should be pass
17530 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20  ed through.  ** 
17540 74 68 65 20 63 6f 64 65 63 2e 20 20 49 74 20 69  the codec.  It i
17550 73 20 66 61 6c 73 65 20 66 6f 72 20 70 75 72 65  s false for pure
17560 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
17570 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  als. */.  const 
17580 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d 20 28 69  int jrnlEnc = (i
17590 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 50 61  sMainJrnl || pPa
175a0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
175b0 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  y==0);.#endif.. 
175c0 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e   assert( (isMain
175d0 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20  Jrnl&~1)==0 );  
175e0 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e      /* isMainJrn
175f0 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  l is 0 or 1 */. 
17600 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65   assert( (isSave
17610 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  pnt&~1)==0 );   
17620 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74      /* isSavepnt
17630 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
17640 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72  assert( isMainJr
17650 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20  nl || pDone );  
17660 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61     /* pDone alwa
17670 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a  ys used on sub-j
17680 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73  ournals */.  ass
17690 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c  ert( isSavepnt |
176a0 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20  | pDone==0 );   
176b0 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75  /* pDone never u
176c0 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70  sed on non-savep
176d0 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61  oint */..  aData
176e0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
176f0 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pace;.  assert( 
17700 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20  aData );        
17710 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
17720 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
17730 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
17740 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  d */.  assert( p
17750 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17760 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69  r)==0 || (!isMai
17770 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70  nJrnl && isSavep
17780 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  nt) );..  /* Eit
17790 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73  her the state is
177a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41   greater than PA
177b0 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
177c0 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69  MOD (a transacti
177d0 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65  on .  ** or save
177e0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64  point rollback d
177f0 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65  one at the reque
17800 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  st of the caller
17810 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a  ) or this is.  *
17820 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
17830 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20  rollback. If it 
17840 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
17850 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
17860 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20  ager.  ** is in 
17870 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68  state OPEN and h
17880 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56  olds an EXCLUSIV
17890 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72  E lock. Hot-jour
178a0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  nal rollback.  *
178b0 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f  * only reads fro
178c0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
178d0 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d  al, not the sub-
178e0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
178f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17900 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
17910 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
17920 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
17930 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
17940 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65  PEN && pPager->e
17950 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
17960 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73  LOCK).  );.  ass
17970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
17980 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
17990 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73  R_CACHEMOD || is
179a0 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f  MainJrnl );..  /
179b0 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
179c0 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
179d0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f  data from the jo
179e0 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
179f0 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  rnal.  ** file. 
17a00 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
17a10 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
17a20 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  er if an IO erro
17a30 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20  r occurs..  */. 
17a40 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e   jfd = isMainJrn
17a50 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
17a60 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a  : pPager->sjfd;.
17a70 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
17a80 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
17a90 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
17aa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17ab0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
17ac0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
17ad0 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  fd, (u8*)aData, 
17ae0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17af0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b  , (*pOffset)+4);
17b00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17b10 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17b20 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20  ;.  *pOffset += 
17b30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17b40 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e   + 4 + isMainJrn
17b50 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  l*4;..  /* Sanit
17b60 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
17b70 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
17b80 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
17b90 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
17ba0 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
17bb0 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
17bc0 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
17bd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
17be0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
17bf0 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
17c00 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
17c10 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
17c20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
17c30 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
17c40 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
17c50 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
17c60 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
17c70 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
17c80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
17c90 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
17ca0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
17cb0 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
17cc0 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  ( !isSavepnt );.
17cd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17ce0 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
17cf0 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61  ( pgno>(Pgno)pPa
17d00 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73  ger->dbSize || s
17d10 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
17d20 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b  (pDone, pgno) ){
17d30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17d40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
17d50 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
17d60 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
17d70 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65  ts(jfd, (*pOffse
17d80 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  t)-4, &cksum);. 
17d90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
17da0 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21  rn rc;.    if( !
17db0 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67  isSavepnt && pag
17dc0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
17dd0 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b   (u8*)aData)!=ck
17de0 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
17df0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
17e00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17e10 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61   If this page ha
17e20 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
17e30 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72  layed back befor
17e40 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
17e50 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
17e60 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
17e70 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
17e80 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
17e90 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
17ea0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
17eb0 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
17ec0 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
17ed0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
17ee0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
17ef0 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
17f00 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
17f10 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
17f20 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
17f30 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
17f40 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
17f50 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
17f60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
17f70 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
17f80 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
17f90 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
17fa0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
17fb0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
17fc0 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
17fd0 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
17fe0 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
17ff0 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
18000 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
18010 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
18020 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
18030 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
18040 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
18050 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
18060 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
18070 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
18080 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
18090 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
180a0 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
180b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
180c0 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
180d0 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
180e0 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
180f0 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
18100 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
18110 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
18120 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
18130 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
18140 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
18150 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
18160 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
18170 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
18180 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
18190 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
181a0 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
181b0 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
181c0 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
181d0 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
181e0 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
181f0 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
18200 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
18210 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
18220 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
18230 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
18240 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
18250 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
18260 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
18270 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
18280 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
18290 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
182a0 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
182b0 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
182c0 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
182d0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
182e0 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
182f0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
18300 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
18310 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
18320 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
18330 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
18340 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
18350 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
18360 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
18370 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
18380 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
18390 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
183a0 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
183b0 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
183c0 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
183d0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
183e0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
183f0 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
18400 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
18410 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
18420 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
18430 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
18440 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
18450 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
18460 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
18470 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
18480 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
18490 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
184a0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
184b0 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
184c0 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
184d0 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
184e0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
184f0 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
18500 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
18510 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
18520 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
18530 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
18540 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
18550 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
18560 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
18570 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
18580 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
18590 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
185a0 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
185b0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
185c0 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
185d0 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
185e0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
185f0 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
18600 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18610 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
18620 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
18630 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
18640 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
18650 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
18660 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
18670 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
18680 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
18690 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
186a0 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
186b0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
186c0 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
186d0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
186e0 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
186f0 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
18700 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
18710 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
18720 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
18730 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
18740 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
18750 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
18760 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
18770 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
18780 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
18790 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
187a0 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
187b0 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
187c0 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
187d0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
187e0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
187f0 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
18800 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
18810 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
18820 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
18830 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
18840 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
18850 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
18860 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
18870 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50   || pPg==0 || pP
18880 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
18890 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
188a0 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
188b0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20  e %d hash(%08x) 
188c0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
188d0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
188e0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
188f0 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
18900 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61  pageSize, (u8*)a
18910 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20  Data),.         
18920 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
18930 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
18940 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
18950 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  ;.  if( isMainJr
18960 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63  nl ){.    isSync
18970 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ed = pPager->noS
18980 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74  ync || (*pOffset
18990 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
189a0 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65  nalHdr);.  }else
189b0 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
189c0 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
189d0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
189e0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a  DR_NEED_SYNC));.
189f0 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e    }.  if( isOpen
18a00 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
18a10 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
18a20 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
18a30 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
18a40 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
18a50 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79  OPEN).   && isSy
18a60 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36  nced.  ){.    i6
18a70 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
18a80 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
18a90 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73  ageSize;.    tes
18aa0 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e  tcase( !isSavepn
18ab0 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28  t && pPg!=0 && (
18ac0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
18ad0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
18ae0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
18af0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
18b00 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 72  r) );..    /* Wr
18b10 69 74 65 20 74 68 65 20 64 61 74 61 20 72 65 61  ite the data rea
18b20 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
18b30 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  al back into the
18b40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
18b50 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75      ** This is u
18b60 73 75 61 6c 6c 79 20 73 61 66 65 20 65 76 65 6e  sually safe even
18b70 20 66 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   for an encrypte
18b80 64 20 64 61 74 61 62 61 73 65 20 2d 20 61 73 20  d database - as 
18b90 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
18ba0 77 61 73 20 65 6e 63 72 79 70 74 65 64 20 62 65  was encrypted be
18bb0 66 6f 72 65 20 69 74 20 77 61 73 20 77 72 69 74  fore it was writ
18bc0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
18bd0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 65 78 63  al file. The exc
18be0 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73  eption.    ** is
18bf0 20 69 66 20 74 68 65 20 64 61 74 61 20 77 61 73   if the data was
18c00 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
18c10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62  an in-memory sub
18c20 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 74 68 61  -journal. In tha
18c30 74 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 69 74  t.    ** case it
18c40 20 6d 75 73 74 20 62 65 20 65 6e 63 72 79 70 74   must be encrypt
18c50 65 64 20 68 65 72 65 20 62 65 66 6f 72 65 20 69  ed here before i
18c60 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
18c70 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
18c80 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a 2f 0a 23    ** file.  */.#
18c90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
18ca0 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20 21  _CODEC.    if( !
18cb0 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20  jrnlEnc ){.     
18cc0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
18cd0 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
18ce0 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rc=SQLITE_NOMEM_
18cf0 42 4b 50 54 2c 20 61 44 61 74 61 29 3b 0a 20 20  BKPT, aData);.  
18d00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18d10 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
18d20 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c  fd, (u8 *)aData,
18d30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18d40 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 20 20  e, ofst);.      
18d50 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61  CODEC1(pPager, a
18d60 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
18d70 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
18d80 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  KPT);.    }else.
18d90 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
18da0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
18db0 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a  Pager->fd, (u8 *
18dc0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
18dd0 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
18de0 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  ..    if( pgno>p
18df0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
18e00 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
18e10 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
18e20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pgno;.    }.    
18e30 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63  if( pPager->pBac
18e40 6b 75 70 20 29 7b 0a 23 69 66 64 65 66 20 53 51  kup ){.#ifdef SQ
18e50 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
18e60 20 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63       if( jrnlEnc
18e70 20 29 7b 0a 20 20 20 20 20 20 20 20 43 4f 44 45   ){.        CODE
18e80 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
18e90 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
18ea0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
18eb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18ec0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
18ed0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
18ee0 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
18ef0 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
18f00 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
18f10 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49  pgno, 7, rc=SQLI
18f20 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 61 44  TE_NOMEM_BKPT,aD
18f30 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ata);.      }els
18f40 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73  e.#endif.      s
18f50 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
18f60 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
18f70 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61  up, pgno, (u8*)a
18f80 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
18f90 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
18fa0 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
18fb0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
18fc0 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
18fd0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
18fe0 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
18ff0 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
19000 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
19010 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
19020 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
19030 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
19040 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
19050 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
19060 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
19070 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
19080 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
19090 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
190a0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
190b0 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
190c0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
190d0 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
190e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
190f0 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
19100 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
19110 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
19120 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
19130 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
19140 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
19150 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
19160 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
19170 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
19180 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
19190 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
191a0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
191b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
191c0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
191d0 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
191e0 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
191f0 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
19200 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19210 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
19220 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
19230 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
19240 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
19250 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
19260 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
19270 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
19280 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
19290 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
192a0 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
192b0 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
192c0 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
192d0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
192e0 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
192f0 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
19300 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
19310 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
19320 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
19330 6e 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nt );.    assert
19340 28 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  ( (pPager->doNot
19350 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
19360 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29  G_ROLLBACK)==0 )
19370 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
19380 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
19390 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
193a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
193b0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
193c0 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b   pgno, &pPg, 1);
193d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
193e0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
193f0 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
19400 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20  LBACK)!=0 );.   
19410 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
19420 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41  ill &= ~SPILLFLA
19430 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
19440 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19450 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
19460 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
19470 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
19480 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b    }.  if( pPg ){
19490 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20  .    /* No page 
194a0 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65  should ever be e
194b0 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64  xplicitly rolled
194c0 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
194d0 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20   use, except.   
194e0 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77   ** for page 1 w
194f0 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
19500 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
19510 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
19520 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
19530 62 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77  base active. How
19540 65 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65  ever such a page
19550 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62   may be rolled b
19560 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a  ack as a result.
19570 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74      ** of an int
19580 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75  ernal error resu
19590 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f  lting in an auto
195a0 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20  matic call to.  
195b0 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
195c0 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20  rRollback()..   
195d0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
195e0 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d  ata;.    pData =
195f0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20   pPg->pData;.   
19600 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 28   memcpy(pData, (
19610 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  u8*)aData, pPage
19620 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19630 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
19640 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 2f 2a  ter(pPg);.    /*
19650 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 74   It used to be t
19660 68 61 74 20 73 71 6c 69 74 65 33 50 63 61 63 68  hat sqlite3Pcach
19670 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 20  eMakeClean(pPg) 
19680 77 61 73 20 63 61 6c 6c 65 64 20 68 65 72 65 2e  was called here.
19690 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 74 68 61    But.    ** tha
196a0 74 20 63 61 6c 6c 20 77 61 73 20 64 61 6e 67 65  t call was dange
196b0 72 6f 75 73 20 61 6e 64 20 68 61 64 20 6e 6f 20  rous and had no 
196c0 64 65 74 65 63 74 61 62 6c 65 20 62 65 6e 65 66  detectable benef
196d0 69 74 20 73 69 6e 63 65 20 74 68 65 20 63 61 63  it since the cac
196e0 68 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 72  he.    ** is nor
196f0 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64 20 62 79  mally cleaned by
19700 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
19710 65 61 6e 41 6c 6c 28 29 20 61 66 74 65 72 20 72  eanAll() after r
19720 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 6f 0a 20  ollback and so. 
19730 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72     ** has been r
19740 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 20 20 70  emoved. */.    p
19750 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
19760 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
19770 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
19780 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
19790 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
197a0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
197b0 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
197c0 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
197d0 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
197e0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
197f0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
19800 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
19810 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
19820 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
19830 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
19840 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
19850 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
19860 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
19870 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  #if SQLITE_HAS_C
19880 4f 44 45 43 0a 20 20 20 20 69 66 28 20 6a 72 6e  ODEC.    if( jrn
19890 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43 31 28 70  lEnc ){ CODEC1(p
198a0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
198b0 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
198c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
198d0 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20  ); }.#endif.    
198e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
198f0 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
19900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19910 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
19920 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
19930 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
19940 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
19950 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
19960 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
19970 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
19980 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
19990 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
199a0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
199b0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
199c0 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
199d0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
199e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
199f0 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
19a00 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
19a10 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
19a20 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
19a30 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
19a40 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
19a50 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
19a60 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
19a70 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
19a80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
19a90 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
19aa0 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
19ab0 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
19ac0 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
19ad0 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
19ae0 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
19af0 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
19b00 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
19b10 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
19b20 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
19b30 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
19b40 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
19b50 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
19b60 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
19b70 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
19b80 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
19b90 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
19ba0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
19bb0 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
19bc0 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
19bd0 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
19be0 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
19bf0 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
19c00 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
19c10 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
19c20 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
19c30 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
19c40 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
19c50 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
19c60 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
19c70 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
19c80 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
19c90 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
19ca0 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
19cb0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
19cc0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
19cd0 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
19ce0 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
19cf0 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
19d00 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19d10 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
19d20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
19d30 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
19d40 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
19d50 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
19d60 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
19d70 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
19d80 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
19d90 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
19da0 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
19db0 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
19dc0 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
19dd0 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
19de0 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
19df0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
19e00 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
19e10 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
19e20 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
19e30 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
19e40 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
19e50 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
19e60 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
19e70 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
19e80 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
19e90 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
19ea0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
19eb0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
19ec0 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
19ed0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
19ee0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
19ef0 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
19f00 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
19f10 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
19f20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
19f30 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
19f40 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
19f50 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
19f60 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
19f70 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
19f80 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
19f90 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
19fa0 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
19fb0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
19fc0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
19fd0 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
19fe0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
19ff0 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
1a000 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
1a010 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
1a020 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
1a030 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1a040 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
1a050 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
1a060 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
1a070 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
1a080 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
1a090 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
1a0a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
1a0b0 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
1a0c0 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
1a0d0 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
1a0e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1a0f0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1a100 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a120 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1a130 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1a140 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
1a150 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
1a160 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
1a170 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
1a180 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
1a190 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
1a1a0 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
1a1b0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1a1c0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1a1d0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
1a1e0 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
1a1f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a200 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
1a210 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
1a220 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
1a230 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1a240 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
1a250 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nal;           /
1a260 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65  * Pointer to one
1a270 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20   journal within 
1a280 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  MJ file */.  cha
1a290 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20  r *zMasterPtr;  
1a2a0 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
1a2b0 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e  to hold MJ filen
1a2c0 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e  ame from a journ
1a2d0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
1a2e0 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20   nMasterPtr;    
1a2f0 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74         /* Amount
1a300 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
1a310 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74  ted to zMasterPt
1a320 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  r[] */..  /* All
1a330 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1a340 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61  both the pJourna
1a350 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69  l and pMaster fi
1a360 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a  le descriptors..
1a370 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66    ** If successf
1a380 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73  ul, open the mas
1a390 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1a3a0 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20   for reading..  
1a3b0 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28  */.  pMaster = (
1a3c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73  sqlite3_file *)s
1a3d0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1a3e0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
1a3f0 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
1a400 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
1a410 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
1a420 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
1a430 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
1a440 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
1a450 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1a460 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
1a470 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
1a480 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
1a490 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
1a4a0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
1a4b0 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
1a4c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1a4d0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
1a4e0 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
1a4f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1a500 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a510 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
1a520 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
1a530 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
1a540 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
1a550 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
1a560 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  m.  ** sqlite3_m
1a570 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
1a580 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
1a590 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f  rJournal.   Also
1a5a0 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66   obtain.  ** suf
1a5b0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 28 69  ficient space (i
1a5c0 6e 20 7a 4d 61 73 74 65 72 50 74 72 29 20 74 6f  n zMasterPtr) to
1a5d0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
1a5e0 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a  of master.  ** j
1a5f0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 65 78 74  ournal files ext
1a600 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 67 75  racted from regu
1a610 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  lar rollback-jou
1a620 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  rnals..  */.  rc
1a630 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1a640 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
1a650 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
1a660 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a670 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
1a680 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73  ster_out;.  nMas
1a690 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
1a6a0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a  xPathname+1;.  z
1a6b0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
1a6c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d  sqlite3Malloc(nM
1a6d0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
1a6e0 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
1a6f0 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
1a700 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
1a710 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1a720 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65  KPT;.    goto de
1a730 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d  lmaster_out;.  }
1a740 0a 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  .  zMasterPtr = 
1a750 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
1a760 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31  nMasterJournal+1
1a770 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ];.  rc = sqlite
1a780 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
1a790 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
1a7a0 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
1a7b0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20  rnal, 0);.  if( 
1a7c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a7d0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
1a7e0 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75  ut;.  zMasterJou
1a7f0 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72  rnal[nMasterJour
1a800 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f  nal] = 0;..  zJo
1a810 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
1a820 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28  ournal;.  while(
1a830 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
1a840 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
1a850 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
1a860 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
1a870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
1a880 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
1a890 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
1a8a0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
1a8b0 73 74 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sts);.    if( rc
1a8c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a8d0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
1a8e0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
1a8f0 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
1a900 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  .      /* One of
1a910 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
1a920 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
1a930 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
1a940 78 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  xists..      ** 
1a950 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
1a960 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
1a970 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
1a980 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a  rnal. If.      *
1a990 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
1a9a0 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
1a9b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a9c0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
1a9d0 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20        int c;.   
1a9e0 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
1a9f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1aa00 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
1aa10 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
1aa20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1aa30 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
1aa40 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61  Journal, pJourna
1aa50 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  l, flags, 0);.  
1aa60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1aa70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aa80 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1aa90 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1aaa0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1aab0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
1aac0 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
1aad0 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
1aae0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
1aaf0 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
1ab00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ab10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ab20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1ab30 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1ab40 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
1ab50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
1ab60 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
1ab70 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
1ab80 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
1ab90 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
1aba0 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
1abb0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
1abc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
1abd0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
1abe0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
1abf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
1ac00 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
1ac10 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
1ac20 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a  rnal)+1);.  }. .
1ac30 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
1ac40 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20  (pMaster);.  rc 
1ac50 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
1ac60 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
1ac70 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
1ac80 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
1ac90 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
1aca0 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61 73 74  al);.  if( pMast
1acb0 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
1acc0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
1acd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
1ace0 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
1acf0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1ad00 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
1ad10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ad20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1ad30 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1ad40 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 61 63  to change the ac
1ad50 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
1ad60 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
1ad70 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
1ad80 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79  ystem. This only
1ad90 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f   happens when co
1ada0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
1adb0 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f  action,.** or ro
1adc0 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61  lling back a tra
1add0 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64  nsaction (includ
1ade0 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  ing rolling back
1adf0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
1ae00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61  .**.** If the ma
1ae10 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1ae20 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
1ae30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
1ae40 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44  t in either.** D
1ae50 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  BMOD or OPEN sta
1ae60 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
1ae70 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  n is a no-op. Ot
1ae80 68 65 72 77 69 73 65 2c 20 74 68 65 20 73 69 7a  herwise, the siz
1ae90 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c  e .** of the fil
1aea0 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  e is changed to 
1aeb0 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e 50 61  nPage pages (nPa
1aec0 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ge*pPager->pageS
1aed0 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20  ize bytes). .** 
1aee0 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  If the file on d
1aef0 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  isk is currently
1af00 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 50 61   larger than nPa
1af10 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e 20 75  ge pages, then u
1af20 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20 78 54  se the VFS.** xT
1af30 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64  runcate() method
1af40 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69 74 2e   to truncate it.
1af50 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69  .**.** Or, it mi
1af60 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
1af70 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f 6e  that the file on
1af80 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72   disk is smaller
1af90 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20   than .** nPage 
1afa0 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72  pages. Some oper
1afb0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
1afc0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
1afd0 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
1afe0 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f 20   .** you try to 
1aff0 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
1b000 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
1b010 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
1b020 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   it .** currentl
1b030 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74 20  y is, so detect 
1b040 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72  this case and wr
1b050 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72  ite a single zer
1b060 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68  o byte to .** th
1b070 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
1b080 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
1b090 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1b0a0 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ul, return SQLIT
1b0b0 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65  E_OK. If an IO e
1b0c0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1b0d0 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74  e modifying.** t
1b0e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b0f0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  , return the err
1b100 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
1b110 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
1b120 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63   int pager_trunc
1b130 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
1b140 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
1b150 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b160 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
1b170 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
1b180 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
1b190 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b1a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 52  >eState!=PAGER_R
1b1b0 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69 66  EADER );.  .  if
1b1c0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1b1d0 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50 61  >fd) .   && (pPa
1b1e0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1b1f0 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1b200 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1b210 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a  e==PAGER_OPEN) .
1b220 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72    ){.    i64 cur
1b230 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
1b240 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  e;.    int szPag
1b250 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
1b260 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
1b270 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
1b280 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1b290 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  );.    /* TODO: 
1b2a0 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
1b2b0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
1b2c0 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
1b2d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1b2e0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1b2f0 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
1b300 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
1b310 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61 67  szPage*(i64)nPag
1b320 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
1b330 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
1b340 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
1b350 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
1b360 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
1b370 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
1b380 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
1b390 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
1b3a0 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
1b3b0 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72 65  }else if( (curre
1b3c0 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d  ntSize+szPage)<=
1b3d0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1b3e0 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d 20     char *pTmp = 
1b3f0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1b400 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e;.        memse
1b410 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67  t(pTmp, 0, szPag
1b420 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  e);.        test
1b430 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d 73  case( (newSize-s
1b440 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65 6e  zPage) == curren
1b450 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  tSize );.       
1b460 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53   testcase( (newS
1b470 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20 63  ize-szPage) >  c
1b480 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20  urrentSize );.  
1b490 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b4a0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1b4b0 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61  ->fd, pTmp, szPa
1b4c0 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61  ge, newSize-szPa
1b4d0 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1b4e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b4f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b500 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1b510 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
1b520 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1b530 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b540 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61 6e  .** Return a san
1b550 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  itized version o
1b560 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  f the sector-siz
1b570 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46 69  e of OS file pFi
1b580 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  le. The.** retur
1b590 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72 61  n value is guara
1b5a0 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65 74  nteed to lie bet
1b5b0 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f  ween 32 and MAX_
1b5c0 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a  SECTOR_SIZE..*/.
1b5d0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74 6f  int sqlite3Secto
1b5e0 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1b5f0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
1b600 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65 33  t iRet = sqlite3
1b610 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46 69  OsSectorSize(pFi
1b620 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74 3c  le);.  if( iRet<
1b630 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20 3d  32 ){.    iRet =
1b640 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66   512;.  }else if
1b650 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f  ( iRet>MAX_SECTO
1b660 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
1b670 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
1b680 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
1b690 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45 43    iRet = MAX_SEC
1b6a0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20  TOR_SIZE;.  }.  
1b6b0 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a  return iRet;.}..
1b6c0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
1b6d0 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
1b6e0 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
1b6f0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
1b700 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
1b710 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
1b720 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1b730 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
1b740 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
1b750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b760 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
1b770 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a  will be used .**
1b780 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1b790 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e  e size and align
1b7a0 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ment of journal 
1b7b0 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d  header and .** m
1b7c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
1b7d0 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63 72  inters within cr
1b7e0 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69  eated journal fi
1b7f0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  les..**.** For t
1b800 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 74  emporary files t
1b810 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1b820 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77 61  tor size is alwa
1b830 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a  ys 512 bytes..**
1b840 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 66  .** Otherwise, f
1b850 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79  or non-temporary
1b860 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66 65   files, the effe
1b870 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1b880 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  e is.** the valu
1b890 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1b8a0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  e xSectorSize() 
1b8b0 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20 75  method rounded u
1b8c0 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74  p to 32 if.** it
1b8d0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 33 32   is less than 32
1b8e0 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64 6f 77  , or rounded dow
1b8f0 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f  n to MAX_SECTOR_
1b900 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20 69 73  SIZE if it.** is
1b910 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 4d 41   greater than MA
1b920 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1b930 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1b940 20 68 61 73 20 74 68 65 20 53 51 4c 49 54 45 5f   has the SQLITE_
1b950 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1b960 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70 65 72  OVERWRITE proper
1b970 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20  ty, then set.** 
1b980 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1b990 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69 74 73  ctor size to its
1b9a0 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28   minimum value (
1b9b0 35 31 32 29 2e 20 20 54 68 65 20 70 75 72 70 6f  512).  The purpo
1b9c0 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d  se of.** pPager-
1b9d0 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 74  >sectorSize is t
1b9e0 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22 62 6c  o define the "bl
1b9f0 61 73 74 20 72 61 64 69 75 73 22 20 6f 66 20 62  ast radius" of b
1ba00 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67  ytes that.** mig
1ba10 68 74 20 63 68 61 6e 67 65 20 69 66 20 61 20 63  ht change if a c
1ba20 72 61 73 68 20 6f 63 63 75 72 73 20 77 68 69 6c  rash occurs whil
1ba30 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20 73  e writing to a s
1ba40 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a  ingle byte in.**
1ba50 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20 42 75   that range.  Bu
1ba60 74 20 77 69 74 68 20 50 4f 57 45 52 53 41 46 45  t with POWERSAFE
1ba70 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68 65 20  _OVERWRITE, the 
1ba80 62 6c 61 73 74 20 72 61 64 69 75 73 20 69 73 20  blast radius is 
1ba90 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73  zero.** (that is
1baa0 20 77 68 61 74 20 50 4f 57 45 52 53 41 46 45 5f   what POWERSAFE_
1bab0 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e 73 29  OVERWRITE means)
1bac0 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65  , so we minimize
1bad0 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73   the sector.** s
1bae0 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b 77 61  ize.  For backwa
1baf0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
1bb00 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  y of the rollbac
1bb10 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  k journal file f
1bb20 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e  ormat,.** we can
1bb30 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65 20 65  not reduce the e
1bb40 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1bb50 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a  size below 512..
1bb60 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1bb70 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
1bb80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
1bb90 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1bba0 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1bbb0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1bbc0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1bbd0 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28  tempFile.   || (
1bbe0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
1bbf0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
1bc00 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a 20 20  Pager->fd) & .  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1bc20 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1bc30 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21 3d 30  FE_OVERWRITE)!=0
1bc40 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  .  ){.    /* Sec
1bc50 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
1bc60 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
1bc70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
1bc80 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
1bc90 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
1bca0 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
1bcb0 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
1bcc0 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
1bcd0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
1bce0 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a  ll segfault. */.
1bcf0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
1bd00 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
1bd10 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
1bd20 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
1bd30 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1bd40 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
1bd50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
1bd60 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
1bd70 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
1bd80 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
1bd90 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
1bda0 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
1bdb0 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
1bdc0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
1bdd0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
1bde0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
1bdf0 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
1be00 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
1be10 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
1be20 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
1be30 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
1be40 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1be50 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1be60 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1be70 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
1be80 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
1be90 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
1bea0 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
1beb0 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
1bec0 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
1bed0 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
1bee0 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
1bef0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
1bf00 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
1bf10 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1bf20 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1bf30 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
1bf40 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
1bf50 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
1bf60 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
1bf70 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
1bf80 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1bf90 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
1bfa0 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
1bfb0 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
1bfc0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
1bfd0 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
1bfe0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1bff0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1c000 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54   sector size.  T
1c010 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20  he header.**    
1c020 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20     is this many 
1c030 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
1c040 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62  *  (6)  4 byte b
1c050 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1c060 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  r which is the p
1c070 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37  age size..**  (7
1c080 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e 67 20  )  zero padding 
1c090 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  out to the next 
1c0a0 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20  sector size..** 
1c0b0 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (8)  Zero or mo
1c0c0 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
1c0d0 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
1c0e0 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
1c0f0 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
1c100 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
1c110 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
1c120 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
1c130 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
1c140 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
1c150 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
1c160 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
1c170 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
1c180 61 6e 20 74 68 65 20 66 69 72 73 74 20 37 20 69  an the first 7 i
1c190 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
1c1a0 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
1c1b0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
1c1c0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 38  nstance of the 8
1c1d0 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
1c1e0 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
1c1f0 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
1c200 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
1c210 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
1c220 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
1c230 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
1c240 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
1c250 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
1c260 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1c270 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
1c280 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
1c290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c2a0 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
1c2b0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
1c2c0 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
1c2d0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
1c2e0 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
1c2f0 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
1c300 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
1c310 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1c320 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
1c330 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
1c340 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
1c350 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
1c360 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
1c370 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
1c380 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
1c390 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1c3a0 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
1c3b0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
1c3c0 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
1c3d0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
1c3e0 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
1c3f0 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
1c400 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
1c410 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
1c420 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
1c430 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
1c440 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
1c450 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
1c460 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
1c470 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
1c480 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
1c490 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
1c4a0 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
1c4b0 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
1c4c0 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
1c4d0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
1c4e0 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
1c4f0 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
1c500 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
1c510 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
1c520 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
1c530 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
1c540 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
1c550 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
1c560 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
1c570 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
1c580 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
1c590 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
1c5a0 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
1c5b0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1c5c0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
1c5d0 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
1c5e0 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
1c5f0 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
1c600 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
1c610 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
1c620 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
1c630 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
1c640 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
1c650 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
1c660 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
1c670 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
1c680 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
1c690 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
1c6a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
1c6b0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
1c6c0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
1c6d0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
1c6e0 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
1c6f0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1c700 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
1c710 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
1c720 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
1c730 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
1c740 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
1c750 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
1c760 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
1c770 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
1c780 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
1c790 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1c7a0 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
1c7b0 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
1c7c0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
1c7d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
1c7e0 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
1c7f0 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
1c800 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
1c810 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
1c820 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
1c830 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
1c840 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1c850 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
1c860 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
1c870 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
1c880 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1c890 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
1c8a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
1c8b0 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
1c8c0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1c8d0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
1c8e0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
1c8f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1c900 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1c910 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1c920 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
1c930 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c940 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
1c950 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
1c960 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
1c970 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
1c980 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
1c990 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
1c9a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c9b0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
1c9c0 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
1c9d0 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
1c9e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1c9f0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1ca00 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
1ca10 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
1ca20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1ca30 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
1ca40 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
1ca50 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
1ca60 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
1ca70 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1ca80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1ca90 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
1caa0 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
1cab0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
1cac0 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
1cad0 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
1cae0 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
1caf0 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20    int nPlayback 
1cb00 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f  = 0;       /* To
1cb10 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1cb20 67 65 73 20 72 65 73 74 6f 72 65 64 20 66 72 6f  ges restored fro
1cb30 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
1cb40 33 32 20 73 61 76 65 64 50 61 67 65 53 69 7a 65  32 savedPageSize
1cb50 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
1cb60 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  ize;..  /* Figur
1cb70 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1cb80 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1cb90 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1cba0 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1cbb0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1cbc0 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1cbd0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1cbe0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1cbf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1cc00 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1cc10 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1cc20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1cc30 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1cc40 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1cc50 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1cc60 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1cc70 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1cc80 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1cc90 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1cca0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1ccb0 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1ccc0 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1ccd0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1cce0 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1ccf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1cd00 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1cd10 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1cd20 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1cd30 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1cd40 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1cd50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1cd60 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1cd70 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1cd80 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1cd90 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1cda0 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1cdb0 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1cdc0 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1cdd0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1cde0 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1cdf0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1ce00 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1ce10 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d  ,.  ** mxPathnam
1ce20 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20  e is 512, which 
1ce30 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
1ce40 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77  he minimum allow
1ce50 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20  able value.  ** 
1ce60 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20  for pageSize..  
1ce70 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
1ce80 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1ce90 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
1cea0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1ceb0 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1cec0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1ced0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1cee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cef0 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
1cf00 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1cf10 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1cf20 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
1cf30 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1cf40 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
1cf50 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
1cf60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1cf70 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
1cf80 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1cf90 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
1cfa0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1cfb0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
1cfc0 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54  = isHot;..  /* T
1cfd0 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  his loop termina
1cfe0 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20  tes either when 
1cff0 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  a readJournalHdr
1d000 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  () or .  ** page
1d010 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1d020 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72  age() call retur
1d030 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
1d040 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20  r an IO error . 
1d050 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a   ** occurs. .  *
1d060 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
1d070 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1d080 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
1d090 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
1d0a0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
1d0b0 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
1d0c0 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
1d0d0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
1d0e0 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
1d0f0 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
1d100 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
1d110 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
1d120 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
1d130 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c  have failed whil
1d140 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
1d150 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
1d160 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
1d170 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
1d180 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
1d190 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
1d1a0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
1d1b0 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
1d1c0 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
1d1d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d1e0 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
1d1f0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1d200 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1d210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1d220 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
1d230 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1d240 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1d250 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
1d260 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
1d270 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
1d280 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
1d290 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
1d2a0 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
1d2b0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1d2c0 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
1d2d0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
1d2e0 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
1d2f0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
1d300 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
1d310 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
1d320 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
1d330 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
1d340 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
1d350 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d360 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
1d370 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1d380 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1d390 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1d3a0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
1d3b0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1d3c0 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
1d3d0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1d3e0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
1d3f0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1d400 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1d410 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
1d420 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
1d430 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
1d440 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
1d450 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
1d460 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
1d470 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
1d480 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
1d490 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
1d4a0 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
1d4b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1d4c0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
1d4d0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
1d4e0 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
1d4f0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
1d500 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1d510 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
1d520 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
1d530 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
1d540 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1d550 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
1d560 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
1d570 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
1d580 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
1d590 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
1d5a0 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
1d5b0 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
1d5c0 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
1d5d0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
1d5e0 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
1d5f0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
1d600 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
1d610 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
1d620 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
1d630 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
1d640 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
1d650 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
1d660 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
1d670 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
1d680 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1d690 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
1d6a0 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
1d6b0 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
1d6c0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
1d6d0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
1d6e0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
1d6f0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
1d700 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1d710 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
1d720 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
1d730 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d740 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
1d750 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
1d760 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1d770 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
1d780 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
1d790 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
1d7a0 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
1d7b0 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
1d7c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
1d7d0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1d7e0 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1d7f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1d800 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
1d810 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
1d820 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
1d830 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1d840 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
1d850 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
1d860 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1d870 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1d880 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1d890 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1d8a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1d8b0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1d8c0 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
1d8d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d8e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1d8f0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1d900 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1d910 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1d920 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
1d930 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
1d940 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
1d950 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
1d960 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  ack into the .  
1d970 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1d980 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63  le and/or page c
1d990 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
1d9a0 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
1d9b0 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; u++){.      if
1d9c0 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  ( needPagerReset
1d9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
1d9e0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1d9f0 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67  .        needPag
1da00 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20  erReset = 0;.   
1da10 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1da20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
1da30 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26  ne_page(pPager,&
1da40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1da50 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20  ff,0,1,0);.     
1da60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1da70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50  OK ){.        nP
1da80 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  layback++;.     
1da90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1daa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1dab0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1dac0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1dad0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1dae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1daf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1db00 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1db10 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1db20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1db30 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1db40 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1db50 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1db60 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1db70 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1db80 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1db90 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1dba0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1dbb0 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1dbc0 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1dbd0 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1dbe0 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1dbf0 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1dc00 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1dc10 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1dc20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1dc30 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1dc40 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1dc50 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1dc60 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1dc70 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1dc80 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1dc90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1dca0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1dcb0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1dcc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dcd0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1dce0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1dcf0 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1dd00 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1dd10 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1dd20 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1dd30 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1dd40 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1dd50 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1dd60 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1dd70 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1dd80 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1dd90 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1dda0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1ddb0 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1ddc0 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1ddd0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1dde0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1ddf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1de00 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1de10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1de20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1de30 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1de40 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1de50 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
1de60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1de70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1de80 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
1de90 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 61  size(pPager, &sa
1dea0 76 65 64 50 61 67 65 53 69 7a 65 2c 20 2d 31 29  vedPageSize, -1)
1deb0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f 6c 6c 6f  ;.  }.  /* Follo
1dec0 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  wing a rollback,
1ded0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dee0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63  le should be bac
1def0 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61  k in its origina
1df00 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69  l.  ** state pri
1df10 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
1df20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
1df30 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68  on, so invoke th
1df40 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43  e.  ** SQLITE_FC
1df50 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
1df60 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65   file-control me
1df70 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20  thod to disable 
1df80 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69  the.  ** asserti
1df90 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  on that the tran
1dfa0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1dfb0 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20  was modified..  
1dfc0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1dfd0 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74 65 33  _DEBUG.  sqlite3
1dfe0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
1dff0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  t(pPager->fd,SQL
1e000 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
1e010 48 41 4e 47 45 44 2c 30 29 3b 0a 23 65 6e 64 69  HANGED,0);.#endi
1e020 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1e030 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1e040 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1e050 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1e060 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1e070 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1e080 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1e090 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1e0a0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1e0b0 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1e0c0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1e0d0 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1e0e0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1e0f0 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1e100 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1e110 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1e120 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1e130 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1e140 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1e150 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1e160 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1e170 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1e180 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1e190 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1e1a0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1e1b0 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1e1c0 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1e1d0 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1e1e0 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1e1f0 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1e200 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1e210 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1e220 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1e230 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1e240 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1e250 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1e260 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1e270 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1e280 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1e290 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1e2a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1e2b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1e2c0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1e2d0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1e2e0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1e2f0 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1e300 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1e310 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1e320 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1e330 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1e340 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1e350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1e360 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1e370 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1e380 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1e390 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1e3a0 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1e3b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e3c0 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1e3d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1e3e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e3f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1e400 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1e410 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1e420 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1e430 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1e440 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1e450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e460 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1e470 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1e480 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1e490 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1e4a0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1e4b0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1e4c0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1e4d0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1e4e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1e4f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1e500 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1e510 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1e520 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1e530 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1e540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1e550 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1e560 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1e570 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1e580 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1e590 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1e5a0 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1e5b0 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1e5d0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1e5e0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1e5f0 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1e600 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1e610 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1e620 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1e630 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1e640 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1e650 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1e660 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1e670 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1e680 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1e690 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1e6a0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1e6b0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1e6c0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1e6d0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1e6e0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1e6f0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1e700 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1e710 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1e720 20 66 69 6c 65 20 28 6f 72 20 6f 75 74 20 6f 66   file (or out of
1e730 0a 2a 2a 20 74 68 65 20 57 41 4c 20 69 66 20 74  .** the WAL if t
1e740 68 61 74 20 69 73 20 77 68 65 72 65 20 74 68 65  hat is where the
1e750 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 70   most recent cop
1e760 79 20 69 66 20 66 6f 75 6e 64 29 20 69 6e 74 6f  y if found) into
1e770 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
1e780 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
1e790 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
1e7a0 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
1e7b0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
1e7c0 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
1e7d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1e7e0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
1e7f0 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
1e800 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
1e810 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
1e820 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
1e830 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
1e840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1e850 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
1e860 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1e870 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
1e880 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1e890 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
1e8a0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1e8b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
1e8c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1e8d0 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
1e8e0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1e8f0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1e900 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
1e910 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
1e920 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
1e930 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e940 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
1e950 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e960 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
1e970 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32  E_OMIT_WAL.  u32
1e980 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20 20 20   iFrame = 0;    
1e990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
1e9a0 6d 65 20 6f 66 20 57 41 4c 20 63 6f 6e 74 61 69  me of WAL contai
1e9b0 6e 69 6e 67 20 70 67 6e 6f 20 2a 2f 0a 0a 20 20  ning pgno */..  
1e9c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e9d0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
1e9e0 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29  ADER && !MEMDB )
1e9f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
1ea00 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
1ea10 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  ;..  if( pagerUs
1ea20 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
1ea30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ea40 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61  WalFindFrame(pPa
1ea50 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e  ger->pWal, pPg->
1ea60 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
1ea70 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1ea80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1ea90 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1eaa0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
1eab0 65 61 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  eadFrame(pPager-
1eac0 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c 70 50  >pWal, iFrame,pP
1ead0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 70  ager->pageSize,p
1eae0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65  Pg->pData);.  }e
1eaf0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
1eb00 20 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d     i64 iOffset =
1eb10 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28   (pPg->pgno-1)*(
1eb20 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1eb30 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
1eb40 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1eb50 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44  ger->fd, pPg->pD
1eb60 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
1eb70 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b  eSize, iOffset);
1eb80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1eb90 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1eba0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
1ebb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ebc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1ebd0 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  Pg->pgno==1 ){. 
1ebe0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1ebf0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61     /* If the rea
1ec00 64 20 69 73 20 75 6e 73 75 63 63 65 73 73 66 75  d is unsuccessfu
1ec10 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46 69 6c  l, set the dbFil
1ec20 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74  eVers[] to somet
1ec30 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  hing.      ** th
1ec40 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  at will never be
1ec50 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20 76 65   a valid file ve
1ec60 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65  rsion.  dbFileVe
1ec70 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79 0a 20  rs[] is a copy. 
1ec80 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74 65 73       ** of bytes
1ec90 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64   24..39 of the d
1eca0 61 74 61 62 61 73 65 2e 20 20 42 79 74 65 73 20  atabase.  Bytes 
1ecb0 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c  28..31 should al
1ecc0 77 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a  ways be.      **
1ecd0 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73 69 7a   zero or the siz
1ece0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1ecf0 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74 65 73  e in page. Bytes
1ed00 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
1ed10 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68 6f 75  39.      ** shou
1ed20 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d 62 65  ld be page numbe
1ed30 72 73 20 77 68 69 63 68 20 61 72 65 20 6e 65 76  rs which are nev
1ed40 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
1ed50 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20  So filling.     
1ed60 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62 46 69   ** pPager->dbFi
1ed70 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20 61 6c  leVers[] with al
1ed80 6c 20 30 78 66 66 20 62 79 74 65 73 20 73 68 6f  l 0xff bytes sho
1ed90 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
1eda0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
1edb0 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
1edc0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
1edd0 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
1ede0 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
1edf0 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
1ee00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1ee10 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
1ee20 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
1ee30 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
1ee40 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20 65 71  * white noise eq
1ee50 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65 73 20  ualing 16 bytes 
1ee60 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e 69 73  of 0xff is vanis
1ee70 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a  hingly small so.
1ee80 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68 6f 75        ** we shou
1ee90 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a  ld still be ok..
1eea0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
1eeb0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 64 62  emset(pPager->db
1eec0 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66 2c 20  FileVers, 0xff, 
1eed0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
1eee0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
1eef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38   }else{.      u8
1ef00 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
1ef10 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
1ef20 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  )[24];.      mem
1ef30 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1ef40 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1ef50 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
1ef60 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1ef70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f  ;.    }.  }.  CO
1ef80 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
1ef90 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  ->pData, pPg->pg
1efa0 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1efb0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
1efc0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
1efd0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
1efe0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
1eff0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1f000 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
1f010 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
1f020 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1f030 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54  pgno));.  PAGERT
1f040 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
1f050 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
1f060 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1f070 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1f080 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1f090 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1f0a0 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75  (pPg)));..  retu
1f0b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f0c0 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75 65  Update the value
1f0d0 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63   of the change-c
1f0e0 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74  ounter at offset
1f0f0 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a  s 24 and 92 in.*
1f100 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  * the header and
1f110 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72 73   the sqlite vers
1f120 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
1f130 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54  fset 96..**.** T
1f140 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64  his is an uncond
1f150 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20  itional update. 
1f160 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61   See also the pa
1f170 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1f180 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74  ounter().** rout
1f190 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75  ine which only u
1f1a0 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67  pdates the chang
1f1b0 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65  e-counter if the
1f1c0 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75 61   update is actua
1f1d0 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61  lly.** needed, a
1f1e0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1f1f0 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  the pPager->chan
1f200 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74  geCountDone stat
1f210 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
1f220 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1f230 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1f240 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67 29  nter(PgHdr *pPg)
1f250 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  {.  u32 change_c
1f260 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e  ounter;..  /* In
1f270 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1f280 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1f290 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1f2a0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
1f2b0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1f2c0 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1f2d0 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72  (u8*)pPg->pPager
1f2e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b  ->dbFileVers)+1;
1f2f0 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63  .  put32bits(((c
1f300 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  har*)pPg->pData)
1f310 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1f320 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ter);..  /* Also
1f330 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74   store the SQLit
1f340 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1f350 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39   in bytes 96..99
1f360 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74   and in.  ** byt
1f370 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20  es 92..95 store 
1f380 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1f390 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  er for which the
1f3a0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a   version number.
1f3b0 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a    ** is valid. *
1f3c0 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  /.  put32bits(((
1f3d0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1f3e0 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+92, change_cou
1f3f0 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69  nter);.  put32bi
1f400 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1f410 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54  pData)+96, SQLIT
1f420 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
1f430 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
1f440 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a  LITE_OMIT_WAL./*
1f450 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f460 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63  n is invoked onc
1f470 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  e for each page 
1f480 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1f490 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65   been .** writte
1f4a0 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66  n into the log f
1f4b0 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74  ile when a WAL t
1f4c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1f4d0 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61  lled back..** Pa
1f4e0 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20 74  rameter iPg is t
1f4f0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1f500 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68 65  f said page. The
1f510 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a   pCtx argument .
1f520 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  ** is actually a
1f530 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f540 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
1f550 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69  .**.** If page i
1f560 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  Pg is present in
1f570 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20   the cache, and 
1f580 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1f590 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a  ng references,.*
1f5a0 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64 65  * it is discarde
1f5b0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  d. Otherwise, if
1f5c0 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
1f5d0 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69  r more outstandi
1f5e0 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  ng.** references
1f5f0 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1f600 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66  nt is reloaded f
1f610 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1f620 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65  . If the.** atte
1f630 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f  mpt to reload co
1f640 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1f650 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69  atabase is requi
1f660 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a  red and fails, .
1f670 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
1f680 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1f690 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1f6a0 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
1f6b0 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  int pagerUndoCal
1f6c0 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78  lback(void *pCtx
1f6d0 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69  , Pgno iPg){.  i
1f6e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1f6f0 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  K;.  Pager *pPag
1f700 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43  er = (Pager *)pC
1f710 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  tx;.  PgHdr *pPg
1f720 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ;..  assert( pag
1f730 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1f740 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69   );.  pPg = sqli
1f750 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
1f760 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69  Pager, iPg);.  i
1f770 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66  f( pPg ){.    if
1f780 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
1f790 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29  ageRefcount(pPg)
1f7a0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1f7b0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
1f7c0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
1f7d0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1f7e0 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  bPage(pPg);.    
1f7f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f800 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1f810 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
1f820 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
1f830 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f840 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50  rUnrefNotNull(pP
1f850 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
1f860 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66   /* Normally, if
1f870 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1f880 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  s rolled back, a
1f890 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ny backup proces
1f8a0 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64  ses are.  ** upd
1f8b0 61 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20  ated as data is 
1f8c0 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68  copied out of th
1f8d0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1f8e0 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a  al and into the.
1f8f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54    ** database. T
1f900 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72  his is not gener
1f910 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69  ally possible wi
1f920 74 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  th a WAL databas
1f930 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62  e, as.  ** rollb
1f940 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d  ack involves sim
1f950 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74  ply truncating t
1f960 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65  he log file. The
1f970 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20  refore, if one. 
1f980 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d   ** or more fram
1f990 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
1f9a0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1f9b0 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65  the log (and the
1f9c0 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73  refore .  ** als
1f9d0 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  o copied into th
1f9e0 65 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73  e backup databas
1f9f0 65 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74  es) as part of t
1fa00 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
1fa10 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70  .  ** the backup
1fa20 73 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72  s must be restar
1fa30 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ted..  */.  sqli
1fa40 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
1fa50 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
1fa60 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
1fa70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1fa80 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1fa90 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  d to rollback a 
1faa0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61  transaction on a
1fab0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a   WAL database..*
1fac0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1fad0 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61  erRollbackWal(Pa
1fae0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1faf0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
1fb20 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74  /.  PgHdr *pList
1fb30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fb40 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64      /* List of d
1fb50 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65  irty pages to re
1fb60 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f  vert */..  /* Fo
1fb70 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74  r all pages in t
1fb80 68 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72  he cache that ar
1fb90 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  e currently dirt
1fba0 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64  y or have alread
1fbb0 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74  y.  ** been writ
1fbc0 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d  ten (but not com
1fbd0 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c  mitted) to the l
1fbe0 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20  og file, do one 
1fbf0 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c  of the .  ** fol
1fc00 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
1fc10 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68  *   + Discard th
1fc20 65 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69  e cached page (i
1fc30 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20  f refcount==0), 
1fc40 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f  or.  **   + Relo
1fc50 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  ad page content 
1fc60 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1fc70 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30  e (if refcount>0
1fc80 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  )..  */.  pPager
1fc90 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1fca0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
1fcb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1fcc0 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61  Undo(pPager->pWa
1fcd0 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c  l, pagerUndoCall
1fce0 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50  back, (void *)pP
1fcf0 61 67 65 72 2c 20 0a 23 69 66 64 65 66 20 53 51  ager, .#ifdef SQ
1fd00 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52  LITE_OMIT_CONCUR
1fd10 52 45 4e 54 0a 20 20 20 20 20 20 30 0a 23 65 6c  RENT.      0.#el
1fd20 73 65 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  se.      pPager-
1fd30 3e 70 41 6c 6c 52 65 61 64 21 3d 30 0a 23 65 6e  >pAllRead!=0.#en
1fd40 64 69 66 0a 20 20 29 3b 0a 20 20 70 4c 69 73 74  dif.  );.  pList
1fd50 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1fd60 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1fd70 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66  ->pPCache);..#if
1fd80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fd90 5f 43 4f 4e 43 55 52 52 45 4e 54 0a 20 20 2f 2a  _CONCURRENT.  /*
1fda0 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 43   If this is an C
1fdb0 4f 4e 43 55 52 52 45 4e 54 20 74 72 61 6e 73 61  ONCURRENT transa
1fdc0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 70 61 67 65  ction, then page
1fdd0 20 31 20 6d 75 73 74 20 62 65 20 72 65 72 65 61   1 must be rerea
1fde0 64 20 66 72 6f 6d 20 0a 20 20 2a 2a 20 74 68 65  d from .  ** the
1fdf0 20 64 62 20 66 69 6c 65 2c 20 65 76 65 6e 20 69   db file, even i
1fe00 66 20 69 74 20 69 73 20 6e 6f 74 20 64 69 72 74  f it is not dirt
1fe10 79 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  y. This is becau
1fe20 73 65 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  se the b-tree la
1fe30 79 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20 68 61  yer .  ** may ha
1fe40 76 65 20 61 6c 72 65 61 64 79 20 7a 65 72 6f 65  ve already zeroe
1fe50 64 20 74 68 65 20 6e 46 72 65 65 20 61 6e 64 20  d the nFree and 
1fe60 69 54 72 75 6e 6b 20 68 65 61 64 65 72 20 66 69  iTrunk header fi
1fe70 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  elds.  */.  if( 
1fe80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1fe90 20 28 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c   (pList==0 || pL
1fea0 69 73 74 2d 3e 70 67 6e 6f 21 3d 31 29 20 26 26  ist->pgno!=1) &&
1feb0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
1fec0 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  d ){.    rc = pa
1fed0 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1fee0 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20 31  (void*)pPager, 1
1fef0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1ff00 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26   while( pList &&
1ff10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ff20 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65  {.    PgHdr *pNe
1ff30 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  xt = pList->pDir
1ff40 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ty;.    rc = pag
1ff50 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28  erUndoCallback((
1ff60 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
1ff70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
1ff80 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a   pList = pNext;.
1ff90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1ffa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ffb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
1ffc0 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
1ffd0 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e  ite3WalFrames().
1ffe0 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67   As well as logg
1fff0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ing.** the conte
20000 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20  nts of the list 
20010 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64 20  of pages headed 
20020 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63  by pList (connec
20030 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a  ted by pDirty),.
20040 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
20050 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63   notifies any ac
20060 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63  tive backup proc
20070 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20 70  esses that the p
20080 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61  ages have.** cha
20090 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  nged. .**.** The
200a0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 70   list of pages p
200b0 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20  assed into this 
200c0 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79  routine is alway
200d0 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67 65  s sorted by page
200e0 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63   number..** Henc
200f0 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70 70  e, if page 1 app
20100 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e  ears anywhere on
20110 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69   the list, it wi
20120 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74 20  ll be the first 
20130 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  page..*/ .static
20140 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61   int pagerWalFra
20150 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  mes(.  Pager *pP
20160 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
20170 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
20180 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64  object */.  PgHd
20190 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  r *pList,       
201a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
201b0 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f  ist of frames to
201c0 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e   log */.  Pgno n
201d0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
201e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
201f0 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65 72  abase size after
20200 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a   this commit */.
20210 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20230 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
20240 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f  s is a commit */
20250 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20270 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20280 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  code */.  int nL
20290 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
202a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
202b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
202c0 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72  pList */.  PgHdr
202d0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
202e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
202f0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
20300 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ages */..  asser
20310 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20  t( pPager->pWal 
20320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69  );.  assert( pLi
20330 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  st );.#ifdef SQL
20340 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56  ITE_DEBUG.  /* V
20350 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 70  erify that the p
20360 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61  age list is in a
20370 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a  ccending order *
20380 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b  /.  for(p=pList;
20390 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b   p && p->pDirty;
203a0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
203b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67     assert( p->pg
203c0 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e  no < p->pDirty->
203d0 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  pgno );.  }.#end
203e0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  if..  assert( pL
203f0 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c  ist->pDirty==0 |
20400 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20  | isCommit );.  
20410 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  if( isCommit ){.
20420 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20      /* If a WAL 
20430 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
20440 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20  eing committed, 
20450 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e  there is no poin
20460 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20  t in writing.   
20470 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69   ** any pages wi
20480 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
20490 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72  greater than nTr
204a0 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20  uncate into the 
204b0 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  WAL file..    **
204c0 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72   They will never
204d0 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79 20   be read by any 
204e0 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76  client. So remov
204f0 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20  e them from the 
20500 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69  pDirty.    ** li
20510 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  st here. */.    
20520 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d  PgHdr **ppNext =
20530 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69   &pList;.    nLi
20540 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  st = 0;.    for(
20550 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78  p=pList; (*ppNex
20560 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e  t = p)!=0; p=p->
20570 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69  pDirty){.      i
20580 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75  f( p->pgno<=nTru
20590 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  ncate ){.       
205a0 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44   ppNext = &p->pD
205b0 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c  irty;.        nL
205c0 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 50  ist++;.        P
205d0 41 47 45 52 54 52 41 43 45 28 28 22 54 4f 2d 57  AGERTRACE(("TO-W
205e0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 68 61  AL %d page %d ha
205f0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
20600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20610 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
20620 29 2c 20 70 2d 3e 70 67 6e 6f 2c 20 70 61 67 65  ), p->pgno, page
20630 72 5f 70 61 67 65 68 61 73 68 28 70 29 29 29 3b  r_pagehash(p)));
20640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20650 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
20660 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
20670 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a   nList = 1;.  }.
20680 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
20690 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
206a0 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69  ] += nList;..  i
206b0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d  f( pList->pgno==
206c0 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f  1 ) pager_write_
206d0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c  changecounter(pL
206e0 69 73 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ist);.  rc = sql
206f0 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
20700 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
20710 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
20720 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
20730 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
20740 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
20750 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28  Flags.  );.  if(
20760 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20770 26 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  & pPager->pBacku
20780 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70  p ){.    for(p=p
20790 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
207a0 69 72 74 79 29 7b 0a 20 20 20 20 20 20 73 71 6c  irty){.      sql
207b0 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
207c0 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
207d0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a  , p->pgno, (u8 *
207e0 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  )p->pData);.    
207f0 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  }.  }..#ifdef SQ
20800 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
20810 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
20820 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
20830 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
20840 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73  e);.  for(p=pLis
20850 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
20860 79 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 73 65  y){.    pager_se
20870 74 5f 70 61 67 65 68 61 73 68 28 70 29 3b 0a 20  t_pagehash(p);. 
20880 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
20890 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
208a0 20 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72   Begin a read tr
208b0 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
208c0 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   WAL..**.** This
208d0 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
208e0 20 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65   be called "page
208f0 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22  rOpenSnapshot()"
20900 20 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65   because it esse
20910 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73  ntially.** makes
20920 20 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74   a snapshot of t
20930 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  he database at t
20940 68 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74  he current point
20950 20 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65   in time and pre
20960 73 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73  serves.** that s
20970 6e 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20  napshot for use 
20980 62 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e  by the reader in
20990 20 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72   spite of concur
209a0 72 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62  rently changes b
209b0 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65  y.** other write
209c0 72 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74  rs or checkpoint
209d0 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
209e0 6e 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  nt pagerBeginRea
209f0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  dTransaction(Pag
20a00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20a10 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20a30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
20a40 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d  .  int changed =
20a50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20a60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
20a70 63 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65  che must be rese
20a80 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
20a90 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20aa0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
20ab0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
20ac0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
20ad0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
20ae0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a  AGER_READER );..
20af0 20 20 2f 2a 20 73 71 6c 69 74 65 33 57 61 6c 45    /* sqlite3WalE
20b00 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
20b10 6e 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  n() was not call
20b20 65 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ed for the previ
20b30 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ous.  ** transac
20b40 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  tion in locking_
20b50 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 2e 20  mode=EXCLUSIVE. 
20b60 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e   So call it now.
20b70 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 61 72 65    If we.  ** are
20b80 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
20b90 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52  =NORMAL and EndR
20ba0 65 61 64 28 29 20 77 61 73 20 70 72 65 76 69 6f  ead() was previo
20bb0 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a  usly called,.  *
20bc0 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  * the duplicate 
20bd0 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c 65 73 73  call is harmless
20be0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
20bf0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
20c00 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
20c10 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  al);..  rc = sql
20c20 69 74 65 33 57 61 6c 42 65 67 69 6e 52 65 61 64  ite3WalBeginRead
20c30 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
20c40 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67  er->pWal, &chang
20c50 65 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ed);.  if( rc!=S
20c60 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e  QLITE_OK || chan
20c70 67 65 64 20 29 7b 0a 20 20 20 20 70 61 67 65 72  ged ){.    pager
20c80 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
20c90 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48      if( USEFETCH
20ca0 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69 74  (pPager) ) sqlit
20cb0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
20cc0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
20cd0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
20ce0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20cf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20d00 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74  s called as part
20d10 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
20d20 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50  on from PAGER_OP
20d30 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52  EN.** to PAGER_R
20d40 45 41 44 45 52 20 73 74 61 74 65 20 74 6f 20 64  EADER state to d
20d50 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a  etermine the siz
20d60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20d70 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67  e file.** in pag
20d80 65 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  es (assuming the
20d90 20 70 61 67 65 20 73 69 7a 65 20 63 75 72 72 65   page size curre
20da0 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 50  ntly stored in P
20db0 61 67 65 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a  ager.pageSize)..
20dc0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f  **.** If no erro
20dd0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
20de0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
20df0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
20e00 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
20e10 69 6e 20 70 61 67 65 73 20 69 73 20 73 74 6f 72  in pages is stor
20e20 65 64 20 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f  ed in *pnPage. O
20e30 74 68 65 72 77 69 73 65 2c 20 61 6e 20 65 72 72  therwise, an err
20e40 6f 72 20 63 6f 64 65 20 28 70 65 72 68 61 70 73  or code (perhaps
20e50 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
20e60 5f 46 53 54 41 54 29 20 69 73 20 72 65 74 75 72  _FSTAT) is retur
20e70 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
20e80 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69  is left unmodifi
20e90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
20ea0 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  t pagerPagecount
20eb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
20ec0 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20  Pgno *pnPage){. 
20ed0 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74   /* Value to ret
20f00 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20  urn via *pnPage 
20f10 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72 79 20 74  */..  /* Query t
20f20 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65  he WAL sub-syste
20f30 6d 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  m for the databa
20f40 73 65 20 73 69 7a 65 2e 20 54 68 65 20 57 61 6c  se size. The Wal
20f50 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75  Dbsize().  ** fu
20f60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a  nction returns z
20f70 65 72 6f 20 69 66 20 74 68 65 20 57 41 4c 20 69  ero if the WAL i
20f80 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e  s not open (i.e.
20f90 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c   Pager.pWal==0),
20fa0 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 20   or.  ** if the 
20fb0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73  database size is
20fc0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
20fd0 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
20fe0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76  e is not.  ** av
20ff0 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  ailable from the
21000 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20   WAL sub-system 
21010 69 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  if the log file 
21020 69 73 20 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a  is empty or.  **
21030 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c   contains no val
21040 69 64 20 63 6f 6d 6d 69 74 74 65 64 20 74 72 61  id committed tra
21050 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  nsactions..  */.
21060 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21070 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
21080 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
21090 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
210a0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
210b0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
210c0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
210d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
210e0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b  ->tempFile==0 );
210f0 0a 20 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  .  nPage = sqlit
21100 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50 61 67  e3WalDbsize(pPag
21110 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a  er->pWal);..  /*
21120 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
21130 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
21140 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
21150 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68  vailable from th
21160 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73  e.  ** WAL sub-s
21170 79 73 74 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65  ystem, determine
21180 20 74 68 65 20 70 61 67 65 20 63 6f 75 6e 74 20   the page count 
21190 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a  based on the siz
211a0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61  e of.  ** the da
211b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
211c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
211d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
211e0 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e  s not an.  ** in
211f0 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f  teger multiple o
21200 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c  f the page-size,
21210 20 72 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65   round up the re
21220 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
21230 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 41 4c 57   nPage==0 && ALW
21240 41 59 53 28 69 73 4f 70 65 6e 28 70 50 61 67 65  AYS(isOpen(pPage
21250 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 69  r->fd)) ){.    i
21260 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21280 53 69 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20  Size of db file 
21290 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
212a0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
212b0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
212c0 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20  r->fd, &n);.    
212d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
212e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
212f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
21300 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28  nPage = (Pgno)((
21310 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n+pPager->pageSi
21320 7a 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e  ze-1) / pPager->
21330 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
21340 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
21350 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
21360 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
21370 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
21380 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75  the.  ** configu
21390 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  red maximum page
213a0 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61  r number, increa
213b0 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c  se the allowed l
213c0 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61  imit so.  ** tha
213d0 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62  t the file can b
213e0 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69  e read..  */.  i
213f0 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  f( nPage>pPager-
21400 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
21410 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
21420 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d  (Pgno)nPage;.  }
21430 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50  ..  *pnPage = nP
21440 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
21450 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
21460 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21470 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  WAL./*.** Check 
21480 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c  if the *-wal fil
21490 65 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  e that correspon
214a0 64 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ds to the databa
214b0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61  se opened by pPa
214c0 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66  ger.** exists if
214d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
214e0 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65   not empy, or ve
214f0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d  rify that the *-
21500 77 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a  wal file does.**
21510 20 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64   not exist (by d
21520 65 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74  eleting it) if t
21530 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21540 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a   is empty..**.**
21550 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
21560 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e   is not empty an
21570 64 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  d the *-wal file
21580 20 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68   exists, open th
21590 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41  e pager.** in WA
215a0 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20  L mode.  If the 
215b0 64 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74  database is empt
215c0 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c  y or if no *-wal
215d0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
215e0 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  .** if no error 
215f0 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72  occurs, make sur
21600 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d  e Pager.journalM
21610 6f 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74  ode is not set t
21620 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e  o.** PAGER_JOURN
21630 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a  ALMODE_WAL..**.*
21640 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
21650 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  OK or an error c
21660 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ode..**.** The c
21670 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  aller must hold 
21680 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
21690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
216a0 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a  le to call this.
216b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63  ** function. Bec
216c0 61 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56  ause an EXCLUSIV
216d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62  E lock on the db
216e0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
216f0 64 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20  d to delete .** 
21700 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d  a WAL on a none-
21710 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20  empty database, 
21720 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65  this ensures the
21730 72 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f  re is no race co
21740 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77  ndition .** betw
21750 65 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28  een the xAccess(
21760 29 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78  ) below and an x
21770 44 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65  Delete() being e
21780 78 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20  xecuted by some 
21790 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63  .** other connec
217a0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
217b0 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  int pagerOpenWal
217c0 49 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20  IfPresent(Pager 
217d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
217e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
217f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21800 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
21810 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  OPEN );.  assert
21820 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
21830 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
21840 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
21850 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
21860 69 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20  int isWal;      
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21880 20 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c   True if WAL fil
21890 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  e exists */.    
218a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
218b0 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 70 50  cess(.        pP
218c0 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
218d0 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45  er->zWal, SQLITE
218e0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
218f0 26 69 73 57 61 6c 0a 20 20 20 20 29 3b 0a 20 20  &isWal.    );.  
21900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
21920 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
21930 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20    Pgno nPage;   
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 64  /* Size of the d
21960 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
21970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
21980 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
21990 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
219a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
219b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
219c0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
219d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
219e0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
219f0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
21a00 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b  Pager->zWal, 0);
21a10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21a20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21a30 73 65 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  se( sqlite3Pcach
21a40 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
21a50 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
21a60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
21a70 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
21a80 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  nWal(pPager, 0);
21a90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21aa0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
21ab0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
21ac0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21ad0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
21ae0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21af0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
21b00 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
21b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21b20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21b30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
21b40 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
21b50 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
21b60 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
21b70 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
21b80 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
21b90 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
21ba0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
21bb0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
21bc0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
21bd0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
21be0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
21bf0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
21c00 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
21c10 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
21c20 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
21c30 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
21c40 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
21c50 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
21c60 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
21c70 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
21c80 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
21c90 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
21ca0 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
21cb0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
21cc0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
21cd0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
21ce0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
21cf0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
21d00 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
21d10 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
21d20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
21d30 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
21d40 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
21d50 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
21d60 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
21d70 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
21d80 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
21d90 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21da0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
21db0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
21dc0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
21dd0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
21de0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
21df0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
21e00 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
21e10 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
21e20 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
21e30 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
21e40 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
21e50 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
21e60 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
21e70 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
21e80 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
21e90 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
21ea0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
21eb0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
21ec0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
21ed0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
21ee0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
21ef0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
21f00 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
21f10 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
21f20 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
21f30 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
21f40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
21f50 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
21f60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
21f70 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
21f80 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
21f90 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
21fa0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
21fb0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
21fc0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
21fd0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
21fe0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
21ff0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
22000 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
22010 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
22020 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
22030 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
22040 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
22050 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
22060 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
22070 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
22080 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
22090 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
220a0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
220b0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
220c0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
220d0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
220e0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
220f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
22100 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
22110 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
22120 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
22130 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
22140 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
22150 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
22160 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
22170 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
22180 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
22190 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
221a0 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
221b0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
221c0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
221d0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
221e0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
221f0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
22200 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
22210 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
22220 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
22230 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
22240 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
22250 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
22260 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
22270 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
22280 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
22290 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
222a0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
222b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
222c0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
222d0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
222e0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
222f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22300 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
22310 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
22320 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
22330 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
22340 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
22350 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
22360 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
22370 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
22380 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
22390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
223a0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
223b0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
223c0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
223d0 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
223e0 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
223f0 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
22400 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
22410 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
22420 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
22430 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
22440 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
22450 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
22460 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
22470 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
22480 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
22490 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
224a0 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
224b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
224c0 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
224d0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
224e0 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
224f0 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
22500 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22510 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
22520 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
22530 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
22540 69 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  igSize;.  pPager
22550 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
22560 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
22570 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53  File;..  if( !pS
22580 61 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65  avepoint && page
22590 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
225a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
225b0 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70  gerRollbackWal(p
225c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
225d0 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
225e0 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
225f0 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
22600 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
22610 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
22620 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
22630 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
22640 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
22650 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
22660 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
22670 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
22680 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
22690 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
226a0 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
226b0 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
226c0 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
226d0 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
226e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
226f0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
22700 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
22710 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20  || szJ==0 );..  
22720 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c  /* Begin by roll
22730 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73  ing back records
22740 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
22750 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
22760 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76  at.  ** PagerSav
22770 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61  epoint.iOffset a
22780 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f  nd continuing to
22790 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
227a0 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54  l header..  ** T
227b0 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65  here might be re
227c0 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69  cords in the mai
227d0 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68  n journal that h
227e0 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ave a page numbe
227f0 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74  r.  ** greater t
22800 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
22810 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70  database size (p
22820 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62  Pager->dbSize) b
22830 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69  ut those.  ** wi
22840 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75  ll be skipped au
22850 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61  tomatically.  Pa
22860 67 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  ges are added to
22870 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20   pDone as they. 
22880 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62   ** are played b
22890 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ack..  */.  if( 
228a0 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  pSavepoint && !p
228b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
228c0 72 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  r) ){.    iHdrOf
228d0 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
228e0 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
228f0 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
22900 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
22910 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22920 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
22930 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
22940 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
22950 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
22960 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
22970 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
22980 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
22990 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
229a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
229b0 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b  f, pDone, 1, 1);
229c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
229d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
229e0 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
229f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
22a00 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
22a10 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
22a20 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
22a30 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
22a40 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
22a50 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
22a60 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
22a70 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
22a80 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
22a90 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
22aa0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
22ab0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
22ac0 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
22ad0 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
22ae0 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
22af0 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
22b00 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
22b10 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
22b20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
22b30 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
22b40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
22b50 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
22b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22b70 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
22b80 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
22b90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22ba0 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
22bb0 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
22bc0 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
22bd0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
22be0 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  r, 0, szJ, &nJRe
22bf0 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
22c00 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22c10 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20  TE_DONE );..    
22c20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70  /*.    ** The "p
22c30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
22c40 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
22c50 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
22c60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20  ->journalOff".  
22c70 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c    ** test is rel
22c80 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23  ated to ticket #
22c90 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64  2565.  See the d
22ca0 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65  iscussion in the
22cb0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  .    ** pager_pl
22cc0 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f  ayback() functio
22cd0 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
22ce0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
22cf0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52    */.    if( nJR
22d00 65 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  ec==0 .     && p
22d10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
22d20 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
22d30 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
22d40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20  ->journalOff.   
22d50 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
22d60 3d 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70  = (u32)((szJ - p
22d70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22d80 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
22d90 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
22da0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72  .    for(ii=0; r
22db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22dc0 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67  ii<nJRec && pPag
22dd0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
22de0 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  zJ; ii++){.     
22df0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
22e00 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
22e10 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
22e20 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65  ournalOff, pDone
22e30 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 1);.    }. 
22e40 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
22e50 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
22e60 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
22e70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
22e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
22e90 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  =szJ );..  /* Fi
22ea0 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b  nally,  rollback
22eb0 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
22ec0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61  sub-journal.  Pa
22ed0 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a  ge that were.  *
22ee0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c  * previously rol
22ef0 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20  led back out of 
22f00 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
22f10 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20   (and are hence 
22f20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77  in pDone).  ** w
22f30 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20  ill be skipped. 
22f40 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   Out-of-range pa
22f50 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69  ges are also ski
22f60 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  pped..  */.  if(
22f70 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
22f80 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
22f90 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22fa0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34  unter */.    i64
22fb0 20 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70   offset = (i64)p
22fc0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
22fd0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
22fe0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66  geSize);..    if
22ff0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
23000 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
23010 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61  c = sqlite3WalSa
23020 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67  vepointUndo(pPag
23030 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70  er->pWal, pSavep
23040 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b  oint->aWalData);
23050 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
23060 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
23070 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
23080 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
23090 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b  r->nSubRec; ii++
230a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
230b0 20 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69   offset==(i64)ii
230c0 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  *(4+pPager->page
230d0 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72  Size) );.      r
230e0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
230f0 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
23100 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f  er, &offset, pDo
23110 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d  ne, 0, 1);.    }
23120 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
23130 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
23140 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
23150 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
23160 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
23170 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
23180 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
23190 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20  f = szJ;.  }..  
231a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
231b0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
231c0 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
231d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
231e0 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
231f0 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65  d.** before atte
23200 6d 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c  mpting to recycl
23210 65 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73  e clean and unus
23220 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69  ed pages..*/.voi
23230 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
23240 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
23250 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
23260 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
23270 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
23280 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
23290 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
232a0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
232b0 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
232c0 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
232d0 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
232e0 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74  wed.** before at
232f0 74 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c  tempting to spil
23300 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e  l pages to journ
23310 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
23320 65 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73  e3PagerSetSpills
23330 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
23340 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
23350 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
23360 50 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69  PcacheSetSpillsi
23370 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
23380 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
23390 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c  /*.** Invoke SQL
233a0 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
233b0 49 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65  IZE based on the
233c0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
233d0 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61  f szMmap..*/.sta
233e0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69  tic void pagerFi
233f0 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20  xMaplimit(Pager 
23400 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51  *pPager){.#if SQ
23410 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
23420 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66  ZE>0.  sqlite3_f
23430 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72  ile *fd = pPager
23440 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70  ->fd;.  if( isOp
23450 65 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d  en(fd) && fd->pM
23460 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
23470 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=3 ){.    sqlit
23480 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20  e3_int64 sz;.   
23490 20 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a   sz = pPager->sz
234a0 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72  Mmap;.    pPager
234b0 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73  ->bUseFetch = (s
234c0 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74 47 65 74  z>0);.    setGet
234d0 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72  terMethod(pPager
234e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
234f0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
23500 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
23510 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
23520 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65  ZE, &sz);.  }.#e
23530 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
23540 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
23550 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d   size of any mem
23560 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65  ory mapping made
23570 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23580 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   file..*/.void s
23590 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
235a0 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  apLimit(Pager *p
235b0 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69  Pager, sqlite3_i
235c0 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
235d0 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d  pPager->szMmap =
235e0 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72   szMmap;.  pager
235f0 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67  FixMaplimit(pPag
23600 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  er);.}../*.** Fr
23610 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
23620 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
23630 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  om the pager..*/
23640 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
23650 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a  erShrink(Pager *
23660 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74  pPager){.  sqlit
23670 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70  e3PcacheShrink(p
23680 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
23690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
236a0 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74 68 65   settings of the
236b0 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73 65 20   pager to those 
236c0 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
236d0 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d 65 74   pgFlags paramet
236e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c  er..**.** The "l
236f0 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61 67 73  evel" in pgFlags
23700 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f   & PAGER_SYNCHRO
23710 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73 20 74  NOUS_MASK sets t
23720 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a  he robustness.**
23730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
23740 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
23750 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f 72 20  o OS crashes or 
23760 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
23770 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68  y.** changing th
23780 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
23790 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
237a0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a  g the journals..
237b0 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66 6f 75  ** There are fou
237c0 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  r levels:.**.** 
237d0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
237e0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
237f0 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
23800 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
23810 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
23820 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
23830 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
23840 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
23850 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
23860 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
23870 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
23880 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
23890 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
238a0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
238b0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
238c0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
238d0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
238e0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
238f0 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
23900 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
23910 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
23920 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
23930 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
23940 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
23950 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
23960 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23970 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
23980 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
23990 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
239a0 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
239b0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
239c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
239d0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
239e0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
239f0 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
23a00 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
23a10 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
23a20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
23a30 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
23a40 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
23a50 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
23a60 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
23a70 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
23a80 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
23a90 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
23aa0 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
23ac0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
23ad0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
23ae0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23af0 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
23b00 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
23b10 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
23b20 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
23b30 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
23b40 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
23b50 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
23b60 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
23b70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
23b80 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
23b90 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
23ba0 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
23bb0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  llback..**.**   
23bc0 20 45 58 54 52 41 20 20 20 20 20 54 68 69 73 20   EXTRA     This 
23bd0 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63  is like FULL exc
23be0 65 70 74 20 74 68 61 74 20 69 73 20 61 6c 73 6f  ept that is also
23bf0 20 73 79 6e 63 73 20 74 68 65 20 64 69 72 65 63   syncs the direc
23c00 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  tory.**         
23c10 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74 61 69       that contai
23c20 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ns the rollback 
23c30 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20 74 68  journal after th
23c40 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20  e rollback.**   
23c50 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
23c60 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a  al is unlinked..
23c70 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
23c80 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
23c90 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
23ca0 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
23cb0 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
23cc0 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
23cd0 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
23ce0 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
23cf0 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
23d00 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
23d10 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
23d20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
23d30 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
23d40 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
23d50 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
23d60 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
23d70 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
23d80 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
23d90 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
23da0 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
23db0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
23dc0 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
23dd0 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
23de0 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
23df0 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
23e00 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
23e10 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
23e20 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
23e30 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
23e40 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
23e50 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
23e60 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
23e70 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
23e80 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20  ed with NORMAL. 
23e90 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66   There is no dif
23ea0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
23eb0 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52  FULL.** and EXTR
23ec0 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a  A for WAL mode..
23ed0 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
23ee0 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
23ef0 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
23f00 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
23f10 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
23f20 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
23f30 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
23f40 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
23f50 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
23f60 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
23f70 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
23f80 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
23f90 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
23fa0 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
23fb0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
23fc0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
23fd0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
23fe0 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
23ff0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
24000 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
24010 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
24020 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
24030 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
24040 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
24050 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
24060 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
24070 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
24080 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
24090 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
240a0 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
240b0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
240c0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
240d0 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
240e0 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
240f0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
24100 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
24110 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
24120 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
24130 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
24140 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
24150 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
24160 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
24170 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
24180 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
24190 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61  Flags      /* Va
241a0 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29  rious flags */.)
241b0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76  {.  unsigned lev
241c0 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50  el = pgFlags & P
241d0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
241e0 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70 50 61  _MASK;.  if( pPa
241f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
24200 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
24210 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
24220 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
24230 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
24240 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20  xtraSync = 0;.  
24250 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
24260 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
24270 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el==PAGER_SYNCHR
24280 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a  ONOUS_OFF ?1:0;.
24290 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
242a0 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41  Sync = level>=PA
242b0 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
242c0 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70  FULL ?1:0;.    p
242d0 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
242e0 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f   = level==PAGER_
242f0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52  SYNCHRONOUS_EXTR
24300 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66  A ?1:0;.  }.  if
24310 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
24320 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24330 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  syncFlags = 0;. 
24340 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
24350 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
24360 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
24370 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
24380 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
24390 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
243a0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
243b0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
243c0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61  ORMAL;.  }.  pPa
243d0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
243e0 73 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 79 6e  s = (pPager->syn
243f0 63 46 6c 61 67 73 3c 3c 32 29 3b 0a 20 20 69 66  cFlags<<2);.  if
24400 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
24410 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
24420 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c  ->walSyncFlags |
24430 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  = pPager->syncFl
24440 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ags;.  }.  if( (
24450 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
24460 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 29 20  CKPT_FULLFSYNC) 
24470 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
24480 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
24490 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c  ->walSyncFlags |
244a0 3d 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  = (SQLITE_SYNC_F
244b0 55 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 69  ULL<<2);.  }.  i
244c0 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  f( pgFlags & PAG
244d0 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29 7b  ER_CACHESPILL ){
244e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
244f0 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c  otSpill &= ~SPIL
24500 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LFLAG_OFF;.  }el
24510 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
24520 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50  doNotSpill |= SP
24530 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
24540 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
24550 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
24560 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
24570 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
24580 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
24590 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
245a0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
245b0 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
245c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
245d0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
245e0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
245f0 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
24600 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
24610 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
24620 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
24630 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
24640 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
24650 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ..**.** Write th
24660 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
24670 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52  r into *pFile. R
24680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
24690 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f  on success .** o
246a0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
246b0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
246c0 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
246d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
246e0 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  * delete the tem
246f0 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
24700 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
24710 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70  *.** The flags p
24720 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53  assed to the VFS
24730 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63   layer xOpen() c
24740 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70  all are those sp
24750 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61  ecified.** by pa
24760 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73  rameter vfsFlags
24770 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66   ORed with the f
24780 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
24790 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
247a0 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20  READWRITE.**    
247b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
247c0 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ATE.**     SQLIT
247d0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
247e0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
247f0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
24800 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
24810 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20  pagerOpentemp(. 
24820 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
24830 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
24840 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
24850 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
24860 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
24870 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
24880 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  or here */.  int
24890 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
248a0 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
248b0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
248c0 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
248d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
248e0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
248f0 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  de */..#ifdef SQ
24900 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
24910 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
24920 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
24930 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
24940 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
24950 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61  #endif..  vfsFla
24960 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50  gs |=  SQLITE_OP
24970 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
24980 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
24990 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
249a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
249b0 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f  USIVE | SQLITE_O
249c0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
249d0 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  E;.  rc = sqlite
249e0 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  3OsOpen(pPager->
249f0 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20  pVfs, 0, pFile, 
24a00 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  vfsFlags, 0);.  
24a10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
24a20 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
24a30 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75  pFile) );.  retu
24a40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24a50 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
24a60 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
24a70 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69  *.** The pager i
24a80 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d  nvokes the busy-
24a90 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74  handler if sqlit
24aa0 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72  e3OsLock() retur
24ab0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ns .** SQLITE_BU
24ac0 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  SY when trying t
24ad0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e  o upgrade from n
24ae0 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52  o-lock to a SHAR
24af0 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77  ED lock,.** or w
24b00 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
24b10 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
24b20 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e  ERVED lock to an
24b30 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c   EXCLUSIVE .** l
24b40 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f  ock. It does *no
24b50 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  t* invoke the bu
24b60 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20  sy handler when 
24b70 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a  upgrading from.*
24b80 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  * SHARED to RESE
24b90 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70  RVED, or when up
24ba0 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41  grading from SHA
24bb0 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  RED to EXCLUSIVE
24bc0 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72  .** (which occur
24bd0 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  s during hot-jou
24be0 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20  rnal rollback). 
24bf0 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  Summary:.**.**  
24c00 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20   Transition     
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75     | Invokes xBu
24c30 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d  syHandler.**   -
24c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24c70 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f  -------.**   NO_
24c80 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48  LOCK       -> SH
24c90 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c  ARED_LOCK      |
24ca0 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44   Yes.**   SHARED
24cb0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52  _LOCK   -> RESER
24cc0 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f  VED_LOCK    | No
24cd0 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
24ce0 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  K   -> EXCLUSIVE
24cf0 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20  _LOCK   | No.** 
24d00 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20    RESERVED_LOCK 
24d10 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
24d20 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20  K   | Yes.**.** 
24d30 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  If the busy-hand
24d40 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  ler callback ret
24d50 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
24d60 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72  he lock is .** r
24d70 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65  etried. If it re
24d80 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e  turns zero, then
24d90 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
24da0 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74   error is.** ret
24db0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
24dc0 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72  ler of the pager
24dd0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   API function..*
24de0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
24df0 67 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65  gerSetBusyHandle
24e00 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
24e10 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
24e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
24e30 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
24e40 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
24e50 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20  r)(void *),     
24e60 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
24e70 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66  o busy-handler f
24e80 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
24e90 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
24ea0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
24eb0 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
24ec0 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61   pass to xBusyHa
24ed0 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ndler */.){.  vo
24ee0 69 64 20 2a 2a 61 70 3b 0a 20 20 70 50 61 67 65  id **ap;.  pPage
24ef0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
24f00 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = xBusyHandler;.
24f10 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
24f20 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73  andlerArg = pBus
24f30 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 20 20 61  yHandlerArg;.  a
24f40 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50  p = (void **)&pP
24f50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
24f60 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28  er;.  assert( ((
24f70 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28  int(*)(void *))(
24f80 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61  ap[0]))==xBusyHa
24f90 6e 64 6c 65 72 20 29 3b 0a 20 20 61 73 73 65 72  ndler );.  asser
24fa0 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48  t( ap[1]==pBusyH
24fb0 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 73  andlerArg );.  s
24fc0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
24fd0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
24fe0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
24ff0 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
25000 6f 69 64 20 2a 29 61 70 29 3b 0a 7d 0a 0a 2f 2a  oid *)ap);.}../*
25010 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
25020 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
25030 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
25040 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
25050 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
25060 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
25070 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
25080 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
25090 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
250a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
250b0 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
250c0 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
250d0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
250e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
250f0 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
25100 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
25110 49 54 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51  ITE_IOERR, an SQ
25120 4c 49 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73  LITE_IOERR_xxx s
25130 75 62 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54  ub-code or SQLIT
25140 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
25150 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
25160 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
25170 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
25180 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
25190 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
251a0 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
251b0 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
251c0 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
251d0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
251e0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
251f0 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
25200 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
25210 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
25220 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
25230 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
25240 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
25250 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
25260 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
25270 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
25280 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
25290 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
252a0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
252b0 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
252c0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
252d0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
252e0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
252f0 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
25300 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
25310 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
25320 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
25330 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
25340 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
25350 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
25360 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
25370 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
25380 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
25390 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
253a0 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
253b0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
253c0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
253d0 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
253e0 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
253f0 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
25400 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
25410 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
25420 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
25430 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
25440 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
25450 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
25460 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
25470 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
25480 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
25490 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
254a0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
254b0 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
254c0 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
254d0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
254e0 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
254f0 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
25500 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
25510 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
25520 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
25530 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
25540 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
25550 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
25560 50 61 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67  Pager, u32 *pPag
25570 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
25580 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
25590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
255a0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
255b0 69 62 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c  ible to do a ful
255c0 6c 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  l assert_pager_s
255d0 74 61 74 65 28 29 20 68 65 72 65 2c 20 61 73 20  tate() here, as 
255e0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
255f0 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
25600 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67   from within Pag
25610 65 72 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65  erOpen(), before
25620 20 74 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20   the state.  ** 
25630 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
25640 65 63 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  ect is internall
25650 79 20 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20  y consistent..  
25660 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70  **.  ** At one p
25670 6f 69 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69  oint this functi
25680 6f 6e 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  on returned an e
25690 72 72 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  rror if the page
256a0 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50  r was in .  ** P
256b0 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65  AGER_ERROR state
256c0 2e 20 42 75 74 20 73 69 6e 63 65 20 50 41 47 45  . But since PAGE
256d0 52 5f 45 52 52 4f 52 20 73 74 61 74 65 20 67 75  R_ERROR state gu
256e0 61 72 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20  arantees that.  
256f0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 74 20 6c  ** there is at l
25700 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
25710 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
25720 6e 63 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  nce, this functi
25730 6f 6e 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d  on.  ** is a no-
25740 6f 70 20 66 6f 72 20 74 68 61 74 20 63 61 73 65  op for that case
25750 20 61 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20   anyhow..  */.. 
25760 20 75 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20   u32 pageSize = 
25770 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  *pPageSize;.  as
25780 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
25790 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
257a0 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
257b0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
257c0 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20  _SIZE) );.  if( 
257d0 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
257e0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
257f0 69 7a 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71  ize==0).   && sq
25800 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
25810 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
25820 63 68 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70  che)==0 .   && p
25830 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
25840 69 7a 65 21 3d 28 75 33 32 29 70 50 61 67 65 72  ize!=(u32)pPager
25850 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b  ->pageSize .  ){
25860 0a 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20  .    char *pNew 
25870 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20  = NULL;         
25880 20 20 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20      /* New temp 
25890 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34  space */.    i64
258a0 20 6e 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20   nByte = 0;..   
258b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
258c0 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26  ate>PAGER_OPEN &
258d0 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
258e0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63  >fd) ){.      rc
258f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
25900 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
25910 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a   &nByte);.    }.
25920 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
25940 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
25950 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
25960 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
25970 20 69 66 28 20 21 70 4e 65 77 20 29 20 72 63 20   if( !pNew ) rc 
25980 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
25990 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
259a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
259b0 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
259c0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
259d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
259e0 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
259f0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
25a00 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
25a10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
25a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25a30 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
25a40 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
25a50 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
25a60 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
25a70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
25a80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
25a90 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61  (Pgno)((nByte+pa
25aa0 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69  geSize-1)/pageSi
25ab0 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ze);.      pPage
25ac0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
25ad0 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73  geSize;.    }els
25ae0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
25af0 50 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  PageFree(pNew);.
25b00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
25b10 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72  ageSize = pPager
25b20 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
25b30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25b40 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65  ){.    if( nRese
25b50 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65  rve<0 ) nReserve
25b60 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65   = pPager->nRese
25b70 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rve;.    assert(
25b80 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20   nReserve>=0 && 
25b90 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b  nReserve<1000 );
25ba0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
25bb0 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65  serve = (i16)nRe
25bc0 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72  serve;.    pager
25bd0 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65  ReportSize(pPage
25be0 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78  r);.    pagerFix
25bf0 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
25c00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25c10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
25c20 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25c30 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
25c40 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
25c50 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
25c60 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
25c70 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
25c80 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
25c90 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
25ca0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
25cb0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
25cc0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
25cd0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
25ce0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
25cf0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
25d00 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
25d10 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
25d20 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
25d30 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
25d40 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
25d50 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
25d60 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
25d70 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
25d80 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
25d90 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
25da0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
25db0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
25dc0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
25dd0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
25de0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
25df0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
25e00 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
25e10 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
25e20 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
25e30 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
25e40 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
25e50 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
25e60 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
25e70 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
25e80 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
25e90 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
25ea0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
25eb0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
25ec0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
25ed0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
25ee0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
25ef0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
25f00 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
25f10 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
25f20 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
25f30 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
25f40 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
25f50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25f60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
25f70 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20  PAGER_OPEN );   
25f80 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c     /* Called onl
25f90 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74  y by OP_MaxPgcnt
25fa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
25fb0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50  ager->mxPgno>=pP
25fc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20  ager->dbSize ); 
25fd0 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   /* OP_MaxPgcnt 
25fe0 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f  enforces this */
25ff0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
26000 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
26010 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
26020 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
26030 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
26040 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
26050 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
26060 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
26070 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
26080 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
26090 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
260a0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
260b0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
260c0 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
260d0 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
260e0 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
260f0 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
26100 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
26110 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
26120 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
26130 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
26140 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
26150 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
26160 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
26170 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
26180 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
26190 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
261a0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
261b0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
261c0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
261d0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
261e0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
261f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
26200 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
26210 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
26220 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
26230 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
26240 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
26250 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
26260 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
26270 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
26280 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
26290 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
262a0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
262b0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
262c0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
262d0 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
262e0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
262f0 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
26300 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
26310 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
26320 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
26330 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
26340 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
26350 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
26360 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
26370 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
26380 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
26390 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
263a0 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
263b0 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
263c0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
263d0 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
263e0 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
263f0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
26400 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
26410 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
26420 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
26430 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
26440 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
26450 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
26460 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
26470 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
26480 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
26490 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
264a0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
264b0 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
264c0 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
264d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
264e0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
264f0 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
26500 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
26510 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
26520 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
26530 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
26540 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
26550 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
26560 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
26570 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
26580 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
26590 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
265a0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
265b0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
265c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
265d0 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  );..  /* This ro
265e0 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
265f0 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d  lled by btree im
26600 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
26610 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  creating.  ** th
26620 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
26630 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62   There has not b
26640 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  een an opportuni
26650 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  ty to transition
26660 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64  .  ** to WAL mod
26670 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e yet..  */.  as
26680 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
26690 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  al(pPager) );.. 
266a0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
266b0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49  er->fd) ){.    I
266c0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
266d0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
266e0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
266f0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
26700 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
26710 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
26720 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
26730 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
26740 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
26750 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
26760 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26770 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26780 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  on may only be c
26790 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61  alled when a rea
267a0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
267b0 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20   open on.** the 
267c0 70 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e  pager. It return
267d0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
267e0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
267f0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
26800 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
26810 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
26820 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
26830 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
26840 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
26850 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
26860 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
26870 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
26880 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
26890 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
268a0 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  *pnPage){.  asse
268b0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
268c0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
268d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
268e0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
268f0 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53  GER_WRITER_FINIS
26900 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65  HED );.  *pnPage
26910 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e   = (int)pPager->
26920 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  dbSize;.}.../*.*
26930 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
26940 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
26950 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
26960 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
26970 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
26980 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
26990 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
269a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
269b0 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
269c0 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
269d0 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
269e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
269f0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
26a00 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
26a10 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
26a20 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
26a30 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
26a40 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
26a50 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
26a60 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
26a70 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
26a80 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
26a90 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
26aa0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
26ab0 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
26ac0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
26ad0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
26ae0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
26af0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
26b00 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
26b10 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
26b20 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
26b30 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
26b40 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
26b50 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
26b60 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
26b70 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
26b80 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
26b90 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
26ba0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
26bb0 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
26bc0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26bf0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
26c00 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
26c10 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
26c20 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
26c30 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
26c40 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
26c50 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e  ady held), or on
26c60 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74  e of the transit
26c70 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
26c80 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
26c90 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
26ca0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
26cb0 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
26cc0 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
26cd0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
26ce0 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
26cf0 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
26d00 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65  >eLock>=locktype
26d10 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
26d20 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  ger->eLock==NO_L
26d30 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
26d40 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
26d50 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
26d60 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  >eLock==RESERVED
26d70 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
26d80 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
26d90 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  K).  );..  do {.
26da0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
26db0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63  ckDb(pPager, loc
26dc0 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65  ktype);.  }while
26dd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
26de0 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
26df0 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
26e00 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
26e10 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  g) );.  return r
26e20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63  c;.}../*.** Func
26e30 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63  tion assertTrunc
26e40 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  ateConstraint(pP
26e50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61  ager) checks tha
26e60 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a  t one of the .**
26e70 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
26e80 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79  ue for all dirty
26e90 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
26ea0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
26eb0 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54  he:.**.**   a) T
26ec0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
26ed0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
26ee0 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65  qual to the size
26ef0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20   of the .**     
26f00 20 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73   current databas
26f10 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65  e image, in page
26f20 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29  s, OR.**.**   b)
26f30 20 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e   if the page con
26f40 74 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65  tent were writte
26f50 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  n at this time, 
26f60 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20  it would not.** 
26f70 20 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72       be necessar
26f80 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63  y to write the c
26f90 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f  urrent content o
26fa0 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  ut to the sub-jo
26fb0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61  urnal.**      (a
26fc0 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
26fd0 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71  function subjReq
26fe0 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a  uiresPage())..**
26ff0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69  .** If the condi
27000 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79  tion asserted by
27010 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
27020 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e  ere not true, an
27030 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  d the.** dirty p
27040 61 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64  age were to be d
27050 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68  iscarded from th
27060 65 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20  e cache via the 
27070 70 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a  pagerStress().**
27080 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53   routine, pagerS
27090 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f  tress() would no
270a0 74 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  t write the curr
270b0 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  ent page content
270c0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   to.** the datab
270d0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73  ase file. If a s
270e0 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63  avepoint transac
270f0 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64  tion were rolled
27100 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74   back after.** t
27110 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68  his happened, th
27120 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
27130 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72  or would be to r
27140 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65  estore the curre
27150 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  nt.** content of
27160 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76   the page. Howev
27170 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63  er, since this c
27180 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  ontent is not pr
27190 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a  esent in either.
271a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
271b0 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74  file or the port
271c0 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ion of the rollb
271d0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ack journal and 
271e0 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
271f0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
27200 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f  content could no
27210 74 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e  t be restored an
27220 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  d the.** databas
27230 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65  e image would be
27240 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74  come corrupt. It
27250 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f   is therefore fo
27260 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a  rtunate that .**
27270 20 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e   this circumstan
27280 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e  ce cannot arise.
27290 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
272a0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74  SQLITE_DEBUG).st
272b0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
272c0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
272d0 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29  ntCb(PgHdr *pPg)
272e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
272f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
27300 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TY );.  assert( 
27310 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
27320 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  e(pPg) || pPg->p
27330 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72  gno<=pPg->pPager
27340 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74  ->dbSize );.}.st
27350 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
27360 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
27370 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
27380 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27390 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
273a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
273b0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
273c0 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23  nstraintCb);.}.#
273d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73  else.# define as
273e0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
273f0 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23  traint(pPager).#
27400 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  endif../*.** Tru
27410 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  ncate the in-mem
27420 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  ory database fil
27430 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65  e image to nPage
27440 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a   pages. This .**
27450 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
27460 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69  ot actually modi
27470 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  fy the database 
27480 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74  file on disk. It
27490 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74   .** just sets t
274a0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  he internal stat
274b0 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f  e of the pager o
274c0 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68  bject so that th
274d0 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e  e .** truncation
274e0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68   will be done wh
274f0 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  en the current t
27500 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
27510 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
27520 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27530 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68  only called righ
27540 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
27550 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
27560 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  n..** Once this 
27570 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
27580 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72  n called, the tr
27590 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65  ansaction must e
275a0 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c  ither be.** roll
275b0 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69  ed back or commi
275c0 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20  tted. It is not 
275d0 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69  safe to call thi
275e0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a  s function and.*
275f0 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20  * then continue 
27600 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
27610 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64  atabase..*/.void
27620 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
27630 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72  ncateImage(Pager
27640 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
27650 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
27660 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
27670 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  =nPage );.  asse
27680 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
27690 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
276a0 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70  _CACHEMOD );.  p
276b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
276c0 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20  nPage;..  /* At 
276d0 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f  one point the co
276e0 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61  de here called a
276f0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
27700 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a  straint() to.  *
27710 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c  * ensure that al
27720 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72  l pages being tr
27730 75 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20  uncated away by 
27740 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61  this operation a
27750 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20  re,.  ** if one 
27760 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
27770 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65  ts are open, pre
27780 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65  sent in the save
27790 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72  point .  ** jour
277a0 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79  nal so that they
277b0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
277c0 20 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   if the savepoin
277d0 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a  t is rolled.  **
277e0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e   back. This is n
277f0 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61  o longer necessa
27800 72 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74  ry as this funct
27810 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a  ion is now only.
27820 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68    ** called righ
27830 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74  t before committ
27840 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
27850 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74  n. So although t
27860 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f  he .  ** Pager o
27870 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20  bject may still 
27880 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f  have open savepo
27890 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76  ints (Pager.nSav
278a0 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a  epoint!=0), .  *
278b0 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65  * they cannot be
278c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f   rolled back. So
278d0 20 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63   the assertTrunc
278e0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20  ateConstraint() 
278f0 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  call.  ** is no 
27900 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20  longer correct. 
27910 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.}.../*.** Thi
27920 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
27930 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65  lled before atte
27940 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75  mpting a hot-jou
27950 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  rnal rollback. I
27960 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a  t.** syncs the j
27970 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64  ournal file to d
27980 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70  isk, then sets p
27990 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
279a0 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65  r to the.** size
279b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
279c0 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  file so that the
279d0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
279e0 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a  ) routine knows.
279f0 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69  ** that the enti
27a00 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  re journal file 
27a10 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
27a20 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61  .**.** Syncing a
27a30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20   hot-journal to 
27a40 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65  disk before atte
27a50 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69  mpting to roll i
27a60 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a  t back ensures .
27a70 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77  ** that if a pow
27a80 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er-failure occur
27a90 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
27aa0 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65  lback, the proce
27ab0 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d  ss that.** attem
27ac0 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c  pts rollback fol
27ad0 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65  lowing system re
27ae0 63 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20  covery sees the 
27af0 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  same journal.** 
27b00 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20  content as this 
27b10 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  process..**.** I
27b20 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
27b30 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51  s as planned, SQ
27b40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27b50 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
27b60 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72  .** an SQLite er
27b70 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
27b80 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e  tic int pagerSyn
27b90 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  cHotJournal(Page
27ba0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
27bb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27bc0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
27bd0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  >noSync ){.    r
27be0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
27bf0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
27c00 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
27c10 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  L);.  }.  if( rc
27c20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
27c30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
27c40 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
27c50 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
27c60 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
27c70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27c80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
27c90 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
27ca0 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
27cb0 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79  ence to a memory
27cc0 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a   mapped page obj
27cd0 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  ect for page num
27ce0 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68  ber pgno. .** Th
27cf0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
27d00 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65  l use the pointe
27d10 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65  r pData, obtaine
27d20 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e  d from xFetch().
27d30 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
27d40 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74  l, set *ppPage t
27d50 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
27d60 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ew page referenc
27d70 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
27d80 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
27d90 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
27da0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
27db0 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70  e and set.** *pp
27dc0 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  Page to zero..**
27dd0 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e  .** Page referen
27de0 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ces obtained by 
27df0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
27e00 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
27e10 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63  released.** by c
27e20 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65  alling pagerRele
27e30 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  aseMapPage()..*/
27e40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
27e50 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
27e60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
27e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27e80 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
27e90 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ct */.  Pgno pgn
27ea0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
27eb0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
27ec0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64  number */.  void
27ed0 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
27ef0 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66  Fetch()'d data f
27f00 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
27f10 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65    PgHdr **ppPage
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
27f40 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a  ed page object *
27f50 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  /.){.  PgHdr *p;
27f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f70 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
27f80 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20   mapped page to 
27f90 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69  return */.  .  i
27fa0 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  f( pPager->pMmap
27fb0 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
27fc0 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50  *ppPage = p = pP
27fd0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27fe0 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ist;.    pPager-
27ff0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
28000 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
28010 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
28020 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28030 72 2d 3e 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a  r->nExtra>=8 );.
28040 20 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45      memset(p->pE
28050 78 74 72 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d  xtra, 0, 8);.  }
28060 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
28070 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
28080 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
28090 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
280a0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
280b0 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
280c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
280d0 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
280e0 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
280f0 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
28100 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
28110 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
28120 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
28130 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45  .    }.    p->pE
28140 78 74 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26  xtra = (void *)&
28150 70 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61  p[1];.    p->fla
28160 67 73 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b  gs = PGHDR_MMAP;
28170 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
28180 3b 0a 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20  ;.    p->pPager 
28190 3d 20 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20  = pPager;.  }.. 
281a0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74   assert( p->pExt
281b0 72 61 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31  ra==(void *)&p[1
281c0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
281d0 2d 3e 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->pPage==0 );.  
281e0 61 73 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73  assert( p->flags
281f0 3d 3d 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a  ==PGHDR_MMAP );.
28200 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
28210 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
28220 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66   assert( p->nRef
28230 3d 3d 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e  ==1 );..  p->pgn
28240 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70  o = pgno;.  p->p
28250 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20  Data = pData;.  
28260 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
28270 2b 2b 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ++;..  return SQ
28280 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
28290 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  f../*.** Release
282a0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
282b0 70 61 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75  page pPg. pPg mu
282c0 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 74  st have been ret
282d0 75 72 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20  urned by an .** 
282e0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
282f0 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
28300 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
28310 20 76 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61   void pagerRelea
28320 73 65 4d 61 70 50 61 67 65 28 50 67 48 64 72 20  seMapPage(PgHdr 
28330 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
28340 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
28350 61 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ager;.  pPager->
28360 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50  nMmapOut--;.  pP
28370 67 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67  g->pDirty = pPag
28380 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
28390 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d  t;.  pPager->pMm
283a0 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67  apFreelist = pPg
283b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
283c0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
283d0 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
283e0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66  ;.  sqlite3OsUnf
283f0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
28400 20 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f   (i64)(pPg->pgno
28410 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  -1)*pPager->page
28420 53 69 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61  Size, pPg->pData
28430 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
28440 20 61 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63   all PgHdr objec
28450 74 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ts stored in the
28460 20 50 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65   Pager.pMmapFree
28470 6c 69 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  list list..*/.st
28480 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
28490 72 65 65 4d 61 70 48 64 72 73 28 50 61 67 65 72  reeMapHdrs(Pager
284a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
284b0 64 72 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a  dr *p;.  PgHdr *
284c0 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70  pNext;.  for(p=p
284d0 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65  Pager->pMmapFree
284e0 6c 69 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74  list; p; p=pNext
284f0 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
28500 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71  ->pDirty;.    sq
28510 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
28520 20 7d 0a 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20   }.}../* Verify 
28530 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
28540 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
28550 65 20 64 65 6c 65 74 65 64 20 6f 72 20 72 65 6e  e deleted or ren
28560 61 6d 65 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a  amed out from.**
28570 20 75 6e 64 65 72 20 74 68 65 20 70 61 67 65 72   under the pager
28580 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
28590 5f 4f 4b 20 69 66 20 74 68 65 20 64 61 74 61 62  _OK if the datab
285a0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 68 65  ase is still whe
285b0 72 65 20 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74  re it ought.** t
285c0 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52  o be on disk.  R
285d0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28  eturn non-zero (
285e0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
285f0 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20  DBMOVED or some 
28600 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
28610 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ode from sqlite3
28620 4f 73 41 63 63 65 73 73 28 29 29 20 69 66 20 74  OsAccess()) if t
28630 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
28640 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f  gone missing..*/
28650 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74 61  .static int data
28660 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 50 61  baseIsUnmoved(Pa
28670 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28680 69 6e 74 20 62 48 61 73 4d 6f 76 65 64 20 3d 20  int bHasMoved = 
28690 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  0;.  int rc;..  
286a0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
286b0 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
286c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
286d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
286e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
286f0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
28700 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
28710 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c   && pPager->zFil
28720 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63  ename[0] );.  rc
28730 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
28740 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
28750 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
28760 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61  _HAS_MOVED, &bHa
28770 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66 28 20 72  sMoved);.  if( r
28780 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
28790 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ND ){.    /* If 
287a0 74 68 65 20 48 41 53 5f 4d 4f 56 45 44 20 66 69  the HAS_MOVED fi
287b0 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e  le-control is un
287c0 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73  implemented, ass
287d0 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ume that the fil
287e0 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e.    ** has not
287f0 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68   been moved.  Th
28800 61 74 20 69 73 20 74 68 65 20 68 69 73 74 6f 72  at is the histor
28810 69 63 61 6c 20 62 65 68 61 76 69 6f 72 20 6f 66  ical behavior of
28820 20 53 51 4c 69 74 65 3a 20 70 72 69 6f 72 20 74   SQLite: prior t
28830 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  o.    ** version
28840 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65 76 65 72   3.8.3, it never
28850 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20   checked */.    
28860 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28870 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
28880 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 48 61  SQLITE_OK && bHa
28890 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 72 63  sMoved ){.    rc
288a0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
288b0 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a  LY_DBMOVED;.  }.
288c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
288d0 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
288e0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
288f0 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
28900 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
28910 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
28920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
28930 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
28940 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
28950 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
28960 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
28970 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
28980 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
28990 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
289a0 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
289b0 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
289c0 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
289d0 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
289e0 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
289f0 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
28a00 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
28a10 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
28a20 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
28a30 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
28a40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28a50 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
28a60 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
28a70 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
28a80 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
28a90 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
28aa0 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
28ab0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
28ac0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
28ad0 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
28ae0 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
28af0 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
28b00 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
28b10 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
28b20 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
28b30 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
28b40 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
28b50 72 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  r, sqlite3 *db){
28b60 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
28b70 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  8*)pPager->pTmpS
28b80 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pace;.  assert( 
28b90 64 62 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  db || pagerUseWa
28ba0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
28bb0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
28bc0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
28bd0 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c  ger) );.  disabl
28be0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
28bf0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
28c00 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
28c10 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72  loc();.  pagerFr
28c20 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72  eeMapHdrs(pPager
28c30 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
28c40 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a  errCode = 0; */.
28c50 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
28c60 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66  iveMode = 0;.#if
28c70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28c80 5f 57 41 4c 0a 20 20 7b 0a 20 20 20 20 75 38 20  _WAL.  {.    u8 
28c90 2a 61 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  *a = 0;.    asse
28ca0 72 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65 72  rt( db || pPager
28cb0 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->pWal==0 );.   
28cc0 20 69 66 28 20 64 62 20 26 26 20 30 3d 3d 28 64   if( db && 0==(d
28cd0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
28ce0 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29  E_NoCkptOnClose)
28cf0 20 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45   .     && SQLITE
28d00 5f 4f 4b 3d 3d 64 61 74 61 62 61 73 65 49 73 55  _OK==databaseIsU
28d10 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 0a 20  nmoved(pPager). 
28d20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20     ){.      a = 
28d30 70 54 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pTmp;.    }.    
28d40 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
28d50 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62  pPager->pWal, db
28d60 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
28d70 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e  cFlags, pPager->
28d80 70 61 67 65 53 69 7a 65 2c 61 29 3b 0a 20 20 20  pageSize,a);.   
28d90 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20   pPager->pWal = 
28da0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
28db0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
28dc0 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
28dd0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
28de0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
28df0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
28e00 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e   it is open, syn
28e10 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
28e20 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
28e30 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  g UnlockAndRollb
28e40 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ack..    ** If t
28e50 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c  his is not done,
28e60 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65   then an unsynce
28e70 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65  d portion of the
28e80 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20   open journal . 
28e90 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62     ** file may b
28ea0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
28eb0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
28ec0 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
28ed0 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20 20  ure occurs .    
28ee0 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69 73  ** while this is
28ef0 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
28f00 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
28f10 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20  ecome corrupt.. 
28f20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
28f30 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
28f40 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
28f50 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28f60 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67 65  , shift the page
28f70 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  r.    ** into th
28f80 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 54  e ERROR state. T
28f90 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f 63  his causes Unloc
28fa0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20  kAndRollback to 
28fb0 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a  unlock the.    *
28fc0 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63  * database and c
28fd0 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
28fe0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 74   file without at
28ff0 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
29000 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20   it.    ** back 
29010 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20  or finalize it. 
29020 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61 73  The next databas
29030 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76 65  e user will have
29040 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e   to do hot-journ
29050 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  al.    ** rollba
29060 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73 73  ck before access
29070 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
29080 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
29090 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
290a0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
290b0 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
290c0 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e 63  Pager, pagerSync
290d0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
290e0 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  r));.    }.    p
290f0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
29100 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
29110 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
29120 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
29130 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
29140 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
29150 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c   PAGERTRACE(("CL
29160 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
29170 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
29180 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
29190 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
291a0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
291b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
291c0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
291d0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
291e0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
291f0 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  Tmp);.  sqlite3P
29200 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
29210 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23 69  r->pPCache);..#i
29220 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
29230 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61 67  CODEC.  if( pPag
29240 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 29  er->xCodecFree )
29250 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
29260 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  ree(pPager->pCod
29270 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  ec);.#endif..  a
29280 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
29290 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
292a0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
292b0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
292c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
292d0 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
292e0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
292f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
29300 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
29310 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29320 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
29330 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
29340 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
29350 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
29360 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
29370 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
29380 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
29390 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
293a0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
293b0 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
293c0 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
293d0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
293e0 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
293f0 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
29400 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
29410 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
29420 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
29430 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
29440 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
29450 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
29460 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
29470 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
29480 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
29490 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
294a0 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
294b0 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
294c0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
294d0 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
294e0 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
294f0 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
29500 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
29510 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
29520 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  noSync flag is s
29530 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  et, then this fu
29540 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
29550 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  p..** Otherwise,
29560 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71   the actions req
29570 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20  uired depend on 
29580 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
29590 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65 76   and the .** dev
295a0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
295b0 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2d  ics of the file-
295c0 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f  system, as follo
295d0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ws:.**.**   * If
295e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
295f0 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  e is an in-memor
29600 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  y journal file, 
29610 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a  no action need.*
29620 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a  *     be taken..
29630 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77  **.**   * Otherw
29640 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69  ise, if the devi
29650 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
29660 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50  ort the SAFE_APP
29670 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a  END property,.**
29680 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52       then the nR
29690 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
296a0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
296b0 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
296c0 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75  ader.**     is u
296d0 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69  pdated to contai
296e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
296f0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20  journal records 
29700 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  that have.**    
29710 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f   been written fo
29720 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74  llowing it. If t
29730 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72  he pager is oper
29740 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79  ating in full-sy
29750 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20  nc.**     mode, 
29760 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
29770 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20   file is synced 
29780 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c  before this fiel
29790 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a  d is updated..**
297a0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64  .**   * If the d
297b0 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73  evice does not s
297c0 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45  upport the SEQUE
297d0 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20  NTIAL property, 
297e0 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75  then .**     jou
297f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
29800 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ced..**.** Or, i
29810 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a  n pseudo-code:.*
29820 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c  *.**   if( NOT <
29830 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
29840 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28  l> ){.**     if(
29850 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44   NOT SAFE_APPEND
29860 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28   ){.**       if(
29870 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65   <full-sync mode
29880 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  > ) xSync(<journ
29890 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
298a0 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63      <update nRec
298b0 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d   field>.**     }
298c0 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54   .**     if( NOT
298d0 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53   SEQUENTIAL ) xS
298e0 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
298f0 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a  e>);.**   }.**.*
29900 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
29910 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
29920 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
29930 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
29940 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
29950 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
29960 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
29970 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
29980 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
29990 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
299a0 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
299b0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
299c0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
299d0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
299e0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
299f0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
29a00 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20  , int newHdr){. 
29a10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29a40 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
29a50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29a60 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
29a70 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  MOD.       || pP
29a80 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29a90 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
29aa0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
29ab0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
29ac0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
29ad0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
29ae0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
29af0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
29b00 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
29b10 6b 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  k(pPager, 0, 0);
29b20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
29b30 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
29b40 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
29b50 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
29b60 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
29b70 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
29b80 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
29b90 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
29ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
29bb0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
29bc0 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
29bd0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63     const int iDc
29be0 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
29bf0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
29c00 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
29c10 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f       assert( isO
29c20 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
29c30 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30   );..      if( 0
29c40 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
29c50 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
29c60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
29c70 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20  his block deals 
29c80 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20  with an obscure 
29c90 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20  problem. If the 
29ca0 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  last connection.
29cb0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
29cc0 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61  wrote to this da
29cd0 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61  tabase was opera
29ce0 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65  ting in persiste
29cf0 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  nt-journal.     
29d00 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e     ** mode, then
29d10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
29d20 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f  e may at this po
29d30 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  int actually be 
29d40 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a  larger.        *
29d50 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75  * than Pager.jou
29d60 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49  rnalOff bytes. I
29d70 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67  f the next thing
29d80 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
29d90 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20          ** file 
29da0 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20  happens to be a 
29db0 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28  journal-header (
29dc0 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20  written as part 
29dd0 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
29de0 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65  * previous conne
29df0 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74  ction's transact
29e00 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73  ion), and a cras
29e10 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75  h or power-failu
29e20 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  re .        ** o
29e30 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65 63  ccurs after nRec
29e40 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74 20   is updated but 
29e50 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e  before this conn
29e60 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20  ection writes . 
29e70 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69         ** anythi
29e80 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a  ng else to the j
29e90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
29ea0 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61  commits/rolls ba
29eb0 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20 20  ck its .        
29ec0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  ** transaction),
29ed0 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79   then SQLite may
29ee0 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64   become confused
29ef0 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20   when doing the 
29f00 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  .        ** hot-
29f10 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
29f20 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76   following recov
29f30 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c  ery. It may roll
29f40 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20   back all.      
29f50 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e    ** of this con
29f60 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74  nections data, t
29f70 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72  hen proceed to r
29f80 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20  olling back the 
29f90 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  old,.        ** 
29fa0 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61  out-of-date data
29fb0 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74   that follows it
29fc0 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75  . Database corru
29fd0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ption..        *
29fe0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20  *.        ** To 
29ff0 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
2a000 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  , if the journal
2a010 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61   file does appea
2a020 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20  r to contain.   
2a030 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20       ** a valid 
2a040 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  header following
2a050 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
2a060 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  f, then write a 
2a070 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20  0x00.        ** 
2a080 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61 72  byte to the star
2a090 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65  t of it to preve
2a0a0 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67  nt it from being
2a0b0 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20   recognized..   
2a0c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2a0d0 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78  ** Variable iNex
2a0e0 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  tHdrOffset is se
2a0f0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
2a100 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20 20  at which this.  
2a110 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d        ** problem
2a120 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c  atic header will
2a130 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65 78   occur, if it ex
2a140 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20  ists. aMagic is 
2a150 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a  used .        **
2a160 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   as a temporary 
2a170 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63  buffer to inspec
2a180 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75 70  t the first coup
2a190 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20  le of bytes of. 
2a1a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f         ** the po
2a1b0 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20  tential journal 
2a1c0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
2a1d0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  */.        i64 i
2a1e0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20  NextHdrOffset;. 
2a1f0 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63         u8 aMagic
2a200 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  [8];.        u8 
2a210 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
2a220 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
2a230 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ;..        memcp
2a240 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
2a250 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
2a260 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
2a270 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62  ;.        put32b
2a280 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
2a290 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
2a2a0 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  c)], pPager->nRe
2a2b0 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65  c);..        iNe
2a2c0 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
2a2d0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
2a2e0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2a2f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
2a300 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
2a310 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74  aMagic, 8, iNext
2a320 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  HdrOffset);.    
2a330 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a340 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63  TE_OK && 0==memc
2a350 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
2a360 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a  nalMagic, 8) ){.
2a370 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
2a380 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79   const u8 zeroby
2a390 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  te = 0;.        
2a3a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2a3b0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
2a3c0 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c  d, &zerobyte, 1,
2a3d0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
2a3e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a3f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a400 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
2a410 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
2a420 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
2a430 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2a440 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
2a450 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
2a460 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
2a470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
2a480 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
2a490 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
2a4a0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
2a4b0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2a4c0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
2a4d0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
2a4e0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
2a4f0 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
2a500 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
2a510 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
2a520 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
2a530 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
2a540 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  for rollback..  
2a550 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2a560 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   ** This is not 
2a570 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20  required if the 
2a580 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
2a590 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20   supports the.  
2a5a0 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50        ** SAFE_AP
2a5b0 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42  PEND property. B
2a5c0 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63  ecause in this c
2a5d0 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  ase it is not po
2a5e0 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20  ssible .        
2a5f0 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64  ** for garbage d
2a600 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64  ata to be append
2a610 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20  ed to the file, 
2a620 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20  the nRec field. 
2a630 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70         ** is pop
2a640 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46  ulated with 0xFF
2a650 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20  FFFFFF when the 
2a660 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
2a670 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20  s written.      
2a680 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e    ** and never n
2a690 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
2a6a0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
2a6b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2a6c0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
2a6d0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
2a6e0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
2a6f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
2a700 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
2a710 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
2a720 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2a730 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
2a740 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
2a750 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
2a760 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a770 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2a780 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
2a790 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20  syncFlags);.    
2a7a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a7b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2a7c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2a7d0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
2a7e0 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22  "JHDR %p %lld\n"
2a7f0 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2a800 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a  ->journalHdr));.
2a810 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2a820 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20  ite3OsWrite(.   
2a830 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2a840 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
2a850 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20  izeof(zHeader), 
2a860 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
2a870 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  dr.        );.  
2a880 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2a890 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
2a8a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
2a8b0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
2a8c0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
2a8d0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
2a8e0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
2a8f0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
2a900 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a910 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
2a920 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
2a930 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
2a940 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
2a950 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
2a960 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
2a970 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20  ->syncFlags| .  
2a980 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
2a990 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49  >syncFlags==SQLI
2a9a0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
2a9b0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
2a9c0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
2a9d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2a9e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2a9f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
2aa00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
2aa10 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
2aa20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2aa30 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72 20       if( newHdr 
2aa40 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
2aa50 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
2aa60 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
2aa70 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
2aa80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
2aa90 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
2aaa0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2aab0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2aac0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
2aad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2aae0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
2aaf0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
2ab00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
2ab10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2ab20 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
2ab30 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d  r is in noSync m
2ab40 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
2ab50 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a   file was just .
2ab60 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c    ** successfull
2ab70 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72  y synced. Either
2ab80 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20   way, clear the 
2ab90 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2aba0 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c  flag on .  ** al
2abb0 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  l pages..  */.  
2abc0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
2abd0 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67  arSyncFlags(pPag
2abe0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2abf0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
2ac00 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
2ac10 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61  MOD;.  assert( a
2ac20 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
2ac30 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  e(pPager) );.  r
2ac40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2ac50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
2ac60 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
2ac70 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
2ac80 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
2ac90 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
2aca0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
2acb0 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
2acc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
2acd0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
2ace0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
2acf0 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
2ad00 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2ad10 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
2ad20 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
2ad30 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
2ad40 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
2ad50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2ad60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
2ad70 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
2ad80 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
2ad90 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
2ada0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
2adb0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2adc0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
2add0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
2ade0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
2adf0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
2ae00 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
2ae10 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
2ae20 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
2ae30 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
2ae40 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
2ae50 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2ae60 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
2ae70 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
2ae80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ae90 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
2aea0 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
2aeb0 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
2aec0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
2aed0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
2aee0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
2aef0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
2af00 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
2af10 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
2af20 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
2af30 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
2af40 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
2af50 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
2af60 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
2af70 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
2af80 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
2af90 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2afa0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
2afb0 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
2afc0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
2afd0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
2afe0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
2aff0 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
2b000 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
2b010 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
2b020 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
2b030 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
2b040 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
2b050 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
2b060 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
2b070 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
2b080 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
2b090 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
2b0a0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
2b0b0 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
2b0c0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
2b0d0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
2b0e0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
2b0f0 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
2b100 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
2b110 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
2b120 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
2b130 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
2b140 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
2b150 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
2b160 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
2b170 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2b180 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
2b190 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2b1a0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2b1b0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
2b1c0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2b1d0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
2b1e0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
2b1f0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
2b200 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
2b210 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
2b220 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2b230 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
2b240 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a  pagelist(Pager *
2b250 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
2b260 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  List){.  int rc 
2b270 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b290 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2b2a0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
2b2b0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ion is only call
2b2c0 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ed for rollback 
2b2d0 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45 52  pagers in WRITER
2b2e0 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f  _DBMOD state. */
2b2f0 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65  .  assert( !page
2b300 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2b310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2b320 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
2b330 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2b340 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
2b350 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
2b360 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
2b370 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
2b380 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
2b390 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
2b3a0 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d  | pList->pDirty=
2b3b0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  =0 );..  /* If t
2b3c0 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d  he file is a tem
2b3d0 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79  p-file has not y
2b3e0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  et been opened, 
2b3f0 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a  open it now. It.
2b400 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73    ** is not poss
2b410 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62  ible for rc to b
2b420 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
2b430 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62  ITE_OK if this b
2b440 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61  ranch.  ** is ta
2b450 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61  ken, as pager_wa
2b460 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20  it_on_lock() is 
2b470 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70  a no-op for temp
2b480 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  -files..  */.  i
2b490 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
2b4a0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73  r->fd) ){.    as
2b4b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
2b4c0 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51  mpFile && rc==SQ
2b4d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
2b4e0 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
2b4f0 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
2b500 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66  ->fd, pPager->vf
2b510 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20  sFlags);.  }..  
2b520 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66 69  /* Before the fi
2b530 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65 20  rst write, give 
2b540 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f  the VFS a hint o
2b550 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c  f what the final
2b560 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  .  ** file size 
2b570 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20  will be..  */.  
2b580 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
2b590 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
2b5a0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2b5b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2b5c0 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67 65 72  OK .   && pPager
2b5d0 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61  ->dbHintSize<pPa
2b5e0 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26  ger->dbSize.   &
2b5f0 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  & (pList->pDirty
2b600 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e   || pList->pgno>
2b610 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
2b620 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ze).  ){.    sql
2b630 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c  ite3_int64 szFil
2b640 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  e = pPager->page
2b650 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f  Size * (sqlite3_
2b660 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62  int64)pPager->db
2b670 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Size;.    sqlite
2b680 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
2b690 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
2b6a0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
2b6b0 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b  _HINT, &szFile);
2b6c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48  .    pPager->dbH
2b6d0 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  intSize = pPager
2b6e0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  ->dbSize;.  }.. 
2b6f0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
2b700 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
2b710 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
2b720 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
2b730 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2b740 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
2b750 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
2b760 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
2b770 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
2b780 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
2b790 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
2b7a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
2b7b0 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
2b7c0 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
2b7d0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
2b7e0 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
2b7f0 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
2b800 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
2b810 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
2b820 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
2b830 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
2b840 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
2b850 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
2b860 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
2b870 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
2b880 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
2b890 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
2b8a0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2b8b0 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
2b8c0 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
2b8d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
2b8e0 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
2b8f0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2b900 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
2b910 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
2b920 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
2b930 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
2b940 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
2b950 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
2b960 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
2b990 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
2b9a0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 69      assert( (pLi
2b9b0 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
2b9c0 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2b9d0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74  .      if( pList
2b9e0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
2b9f0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
2ba00 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20  unter(pList);.. 
2ba10 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74       /* Encode t
2ba20 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2ba30 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2ba40 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
2ba50 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72  , pgno, 6, retur
2ba60 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2ba70 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20  KPT, pData);..  
2ba80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
2ba90 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
2baa0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
2bab0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2bac0 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
2bad0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
2bae0 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
2baf0 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
2bb00 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
2bb10 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
2bb20 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
2bb30 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
2bb40 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
2bb50 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2bb60 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
2bb70 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
2bb80 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
2bb90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
2bba0 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
2bbb0 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
2bbc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
2bbd0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
2bbe0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2bbf0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
2bc00 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
2bc10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2bc20 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
2bc30 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
2bc40 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2bc50 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2bc60 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
2bc70 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pgno;.      }.  
2bc80 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61      pPager->aSta
2bc90 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49  t[PAGER_STAT_WRI
2bca0 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  TE]++;..      /*
2bcb0 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
2bcc0 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
2bcd0 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
2bce0 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
2bcf0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
2bd00 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
2bd10 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
2bd20 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70  o, (u8*)pList->p
2bd30 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41  Data);..      PA
2bd40 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45  GERTRACE(("STORE
2bd50 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68   %d page %d hash
2bd60 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
2bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
2bd80 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2bd90 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
2bda0 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20  ash(pList)));.  
2bdb0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
2bdc0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
2bdd0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
2bde0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
2bdf0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2be00 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
2be10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
2be20 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
2be30 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
2be40 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2be50 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  ), pgno));.    }
2be60 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
2be70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
2be80 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
2be90 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a  t->pDirty;.  }..
2bea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2beb0 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61  /*.** Ensure tha
2bec0 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
2bed0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20  l file is open. 
2bee0 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  If it is already
2bef0 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20   open, this .** 
2bf00 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2bf10 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
2bf20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2bf30 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
2bf40 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
2bf50 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51   plan. An .** SQ
2bf60 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
2bf70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2bf80 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
2bf90 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
2bfa0 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f  () .** fails..*/
2bfb0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
2bfc0 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
2bfd0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2bfe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bff0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
2c000 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
2c010 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
2c020 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50  ags =  SQLITE_OP
2c030 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
2c040 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2c050 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53  WRITE .      | S
2c060 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2c070 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
2c080 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20  EXCLUSIVE .     
2c090 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
2c0a0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
2c0b0 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c    int nStmtSpill
2c0c0 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67   = sqlite3Config
2c0d0 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20  .nStmtSpill;.   
2c0e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
2c0f0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2c100 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2c110 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
2c120 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
2c130 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d      nStmtSpill =
2c140 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   -1;.    }.    r
2c150 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
2c160 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  alOpen(pPager->p
2c170 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Vfs, 0, pPager->
2c180 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74  sjfd, flags, nSt
2c190 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20  mtSpill);.  }.  
2c1a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c1b0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63  .** Append a rec
2c1c0 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  ord of the curre
2c1d0 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65  nt state of page
2c1e0 20 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d   pPg to the sub-
2c1f0 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20  journal. .**.** 
2c200 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
2c210 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
2c220 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
2c230 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
2c240 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
2c250 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
2c260 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2c270 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2c280 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
2c290 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
2c2a0 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
2c2b0 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
2c2c0 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
2c2d0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
2c2e0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
2c2f0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
2c300 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
2c310 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
2c320 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
2c330 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
2c340 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
2c350 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
2c360 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
2c370 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
2c380 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c390 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2c3a0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
2c3b0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2c3c0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2c3d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
2c3e0 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  {..    /* Open t
2c3f0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
2c400 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
2c410 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
2c420 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  d */.    assert(
2c430 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2c440 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  nal );.    asser
2c450 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2c460 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55  ->jfd) || pagerU
2c470 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2c480 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
2c490 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2c4a0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75  ) || pPager->nSu
2c4b0 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  bRec==0 );.    a
2c4c0 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
2c4d0 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  al(pPager) .    
2c4e0 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f       || pageInJo
2c4f0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50  urnal(pPager, pP
2c500 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
2c510 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
2c520 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
2c530 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
2c540 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
2c550 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
2c560 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2c570 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
2c580 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
2c590 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
2c5a0 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
2c5b0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
2c5c0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
2c5d0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2c5e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c5f0 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
2c600 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
2c610 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
2c620 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62  i64)pPager->nSub
2c630 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
2c640 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
2c650 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23  char *pData2;..#
2c660 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
2c670 44 45 43 20 20 20 0a 20 20 20 20 20 20 69 66 28  DEC   .      if(
2c680 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e   !pPager->subjIn
2c690 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
2c6a0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2c6b0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2c6c0 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2c6d0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
2c6e0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 7d  pData2);.      }
2c6f0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2c700 20 20 70 44 61 74 61 32 20 3d 20 70 44 61 74 61    pData2 = pData
2c710 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
2c720 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
2c730 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
2c740 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2c750 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
2c760 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
2c770 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
2c780 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
2c790 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2c7a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c7b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2c7c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2c7d0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
2c7e0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
2c7f0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
2c800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c810 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2c820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
2c830 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
2c840 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2c850 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2c860 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
2c870 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
2c880 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
2c890 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  ->pgno);.  }.  r
2c8a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
2c8b0 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
2c8c0 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28  lPageIfRequired(
2c8d0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
2c8e0 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2c8f0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2c900 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61  return subjourna
2c910 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  lPage(pPg);.  }e
2c920 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2c930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
2c940 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2c950 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2c960 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
2c970 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20  yer when it has 
2c980 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20  reached some.** 
2c990 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69  soft memory limi
2c9a0 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
2c9b0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
2c9c0 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62  er to a Pager ob
2c9d0 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73  ject.** (cast as
2c9e0 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70   a void*). The p
2c9f0 61 67 65 72 20 69 73 20 61 6c 77 61 79 73 20 27  ager is always '
2ca00 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20  purgeable' (not 
2ca10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
2ca20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65 20 73  database). The s
2ca30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
2ca40 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
2ca50 20 61 20 70 61 67 65 20 74 68 61 74 20 69 73 20   a page that is 
2ca60 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69  .** currently di
2ca70 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f  rty but has no o
2ca80 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
2ca90 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a  ences. The page.
2caa0 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61 73 73  ** is always ass
2cab0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2cac0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   Pager object pa
2cad0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
2cae0 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  t .** argument..
2caf0 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66  **.** The job of
2cb00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2cb10 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c  s to make pPg cl
2cb20 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69  ean by writing i
2cb30 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  ts contents.** o
2cb40 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2cb50 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73  se file, if poss
2cb60 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69  ible. This may i
2cb70 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74  nvolve syncing t
2cb80 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
2cb90 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  le. .**.** If su
2cba0 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65  ccessful, sqlite
2cbb0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2cbc0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
2cbd0 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  the page and.** 
2cbe0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2cbf0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
2cc00 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2cc10 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74  trying to make t
2cc20 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e  he.** page clean
2cc30 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
2cc40 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
2cc50 20 49 66 20 74 68 65 20 70 61 67 65 20 63 61 6e   If the page can
2cc60 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63  not be.** made c
2cc70 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74  lean for some ot
2cc80 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20  her reason, but 
2cc90 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
2cca0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a   then SQLITE_OK.
2ccb0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 62  ** is returned b
2ccc0 79 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  y sqlite3PcacheM
2ccd0 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f  akeClean() is no
2cce0 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  t called..*/.sta
2ccf0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
2cd00 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
2cd10 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
2cd20 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
2cd30 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
2cd40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2cd50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
2cd60 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a  ager==pPager );.
2cd70 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
2cd80 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
2cd90 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f   );..  /* The do
2cda0 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20  NotSpill NOSYNC 
2cdb0 62 69 74 20 69 73 20 73 65 74 20 64 75 72 69 6e  bit is set durin
2cdc0 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2cdd0 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2cde0 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2cdf0 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2ce00 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2ce10 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2ce20 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2ce30 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2ce40 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2ce50 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2ce60 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2ce70 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2ce80 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2ce90 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2cea0 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c  e doNotSpill ROL
2ceb0 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69  LBACK and OFF bi
2cec0 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20  ts inhibits all 
2ced0 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20  cache spilling. 
2cee0 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f   ** regardless o
2cef0 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
2cf00 20 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69   a sync is requi
2cf10 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65  red.  This is se
2cf20 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20  t during.  ** a 
2cf30 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75  rollback or by u
2cf40 73 65 72 20 72 65 71 75 65 73 74 2c 20 72 65 73  ser request, res
2cf50 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a  pectively..  **.
2cf60 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73    ** Spilling is
2cf70 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64   also prohibited
2cf80 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f   when in an erro
2cf90 72 20 73 74 61 74 65 20 73 69 6e 63 65 20 74 68  r state since th
2cfa0 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65  at could.  ** le
2cfb0 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
2cfc0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20  orruption.   In 
2cfd0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  the current impl
2cfe0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20  ementation it . 
2cff0 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c   ** is impossibl
2d000 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61  e for sqlite3Pca
2d010 63 68 65 46 65 74 63 68 28 29 20 74 6f 20 62 65  cheFetch() to be
2d020 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65   called with cre
2d030 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20  ateFlag==3.  ** 
2d040 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72  while in the err
2d050 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20  or state, hence 
2d060 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65  it is impossible
2d070 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
2d080 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c  e to.  ** be cal
2d090 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72  led in the error
2d0a0 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68   state.  Neverth
2d0b0 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64  eless, we includ
2d0c0 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a  e a NEVER().  **
2d0d0 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 65 72   test for the er
2d0e0 72 6f 72 20 73 74 61 74 65 20 61 73 20 61 20 73  ror state as a s
2d0f0 61 66 65 67 75 61 72 64 20 61 67 61 69 6e 73 74  afeguard against
2d100 20 66 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e   future changes.
2d110 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
2d120 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
2d130 65 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e) ) return SQLI
2d140 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73  TE_OK;.  testcas
2d150 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2d160 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2d170 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  G_ROLLBACK );.  
2d180 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2d190 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2d1a0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a  PILLFLAG_OFF );.
2d1b0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2d1c0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2d1d0 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e   SPILLFLAG_NOSYN
2d1e0 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  C );.  if( pPage
2d1f0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20  r->doNotSpill.  
2d200 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f   && ((pPager->do
2d210 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c  NotSpill & (SPIL
2d220 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53  LFLAG_ROLLBACK|S
2d230 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d  PILLFLAG_OFF))!=
2d240 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  0.      || (pPg-
2d250 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
2d260 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20  EED_SYNC)!=0).  
2d270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2d280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
2d290 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
2d2a0 47 45 52 5f 53 54 41 54 5f 53 50 49 4c 4c 5d 2b  GER_STAT_SPILL]+
2d2b0 2b 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  +;.  pPg->pDirty
2d2c0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67 65   = 0;.  if( page
2d2d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2d2e0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2d2f0 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e  E_OMIT_CONCURREN
2d300 54 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  T.    /* If the 
2d310 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2d320 20 22 42 45 47 49 4e 20 43 4f 4e 43 55 52 52 45   "BEGIN CONCURRE
2d330 4e 54 22 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  NT" transaction,
2d340 20 74 68 65 20 70 61 67 65 20 0a 20 20 20 20 2a   the page .    *
2d350 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6c 75 73  * cannot be flus
2d360 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 52 65 74  hed to disk. Ret
2d370 75 72 6e 20 65 61 72 6c 79 20 69 6e 20 74 68 69  urn early in thi
2d380 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 69  s case. */.    i
2d390 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52  f( pPager->pAllR
2d3a0 65 61 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ead ) return SQL
2d3b0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
2d3c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
2d3d0 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
2d3e0 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
2d3f0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
2d400 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2d410 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b  IfRequired(pPg);
2d420 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
2d430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d440 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
2d450 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
2d460 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
2d470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0a 23 69 66   }else{.    .#if
2d480 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2d490 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57  E_BATCH_ATOMIC_W
2d4a0 52 49 54 45 0a 20 20 20 20 69 66 28 20 70 50 61  RITE.    if( pPa
2d4b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
2d4c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2d4d0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2d4e0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
2d4f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2d500 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2d510 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2d520 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
2d530 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20  }.#endif.  .    
2d540 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2d550 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2d560 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2d570 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2d580 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2d590 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2d5a0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2d5b0 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2d5c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2d5d0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2d5e0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2d5f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2d600 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2d610 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2d620 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2d630 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d650 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2d660 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2d670 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2d680 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2d690 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2d6a0 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2d6b0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2d6c0 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2d6d0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2d6e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2d6f0 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2d700 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2d710 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2d720 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2d730 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2d740 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2d750 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2d760 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2d770 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  r, rc); .}../*.*
2d780 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65  * Flush all unre
2d790 66 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70  ferenced dirty p
2d7a0 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  ages to disk..*/
2d7b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2d7c0 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50  rFlush(Pager *pP
2d7d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2d7e0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2d7f0 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  e;.  if( !MEMDB 
2d800 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c  ){.    PgHdr *pL
2d810 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
2d820 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2d830 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2d840 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
2d850 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2d860 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69  ager) );.    whi
2d870 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2d880 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
2d890 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
2d8a0 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2d8b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
2d8c0 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  t->nRef==0 ){.  
2d8d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2d8e0 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50  Stress((void*)pP
2d8f0 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ager, pList);.  
2d900 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73      }.      pLis
2d910 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  t = pNext;.    }
2d920 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2d930 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
2d940 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2d950 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
2d960 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
2d970 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
2d980 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
2d990 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
2d9a0 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
2d9b0 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
2d9c0 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
2d9d0 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
2d9e0 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
2d9f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2da00 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
2da10 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2da20 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
2da30 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
2da40 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
2da50 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2da60 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
2da70 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
2da80 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
2da90 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
2daa0 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
2dab0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
2dac0 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
2dad0 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
2dae0 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
2daf0 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
2db00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
2db10 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
2db20 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2db30 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
2db40 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
2db50 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
2db60 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2db70 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
2db80 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
2db90 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
2dba0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2dbb0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
2dbc0 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
2dbd0 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
2dbe0 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
2dbf0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2dc00 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
2dc10 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
2dc20 74 45 78 74 72 61 28 29 20 41 50 49 2e 20 20 57  tExtra() API.  W
2dc30 68 65 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69  hen a new page i
2dc40 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  s allocated, the
2dc50 0a 2a 2a 20 66 69 72 73 74 20 38 20 62 79 74 65  .** first 8 byte
2dc60 73 20 6f 66 20 74 68 69 73 20 73 70 61 63 65 20  s of this space 
2dc70 61 72 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74  are zeroed but t
2dc80 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20  he remainder is 
2dc90 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a  uninitialized..*
2dca0 2a 20 28 54 68 65 20 65 78 74 72 61 20 73 70 61  * (The extra spa
2dcb0 63 65 20 69 73 20 75 73 65 64 20 62 79 20 62 74  ce is used by bt
2dcc0 72 65 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61  ree as the MemPa
2dcd0 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a  ge object.).**.*
2dce0 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
2dcf0 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
2dd00 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
2dd10 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
2dd20 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
2dd30 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
2dd40 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
2dd50 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
2dd60 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
2dd70 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61   the PAGER_* fla
2dd80 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2dd90 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2dda0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2ddb0 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2ddc0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2ddd0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2dde0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2ddf0 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2de00 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2de10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2de20 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2de30 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2de40 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2de50 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2de60 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2de70 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2de80 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2de90 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2dea0 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2deb0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2dec0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2ded0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2dee0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2def0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2df00 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2df10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2df20 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2df30 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2df40 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2df50 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2df60 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2df70 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2df80 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2df90 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2dfa0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2dfb0 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2dfc0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2dfd0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2dfe0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2dff0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2e000 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2e010 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2e020 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2e030 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2e040 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2e050 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2e060 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2e070 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2e080 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2e090 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2e0a0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2e0b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e0d0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2e0e0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2e0f0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2e100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2e110 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2e120 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2e130 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2e140 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2e150 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2e160 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2e170 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2e180 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2e190 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2e1a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2e1b0 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2e1c0 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2e1d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2e1e0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2e1f0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2e200 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2e210 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2e220 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2e230 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2e240 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2e250 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2e260 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e270 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2e280 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 23 69  emory file */.#i
2e290 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2e2a0 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20  LE_DESERIALIZE. 
2e2b0 20 69 6e 74 20 6d 65 6d 4a 4d 20 3d 20 30 3b 20   int memJM = 0; 
2e2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
2e2d0 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ory journal mode
2e2e0 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69   */.#else.# defi
2e2f0 6e 65 20 6d 65 6d 4a 4d 20 30 0a 23 65 6e 64 69  ne memJM 0.#endi
2e300 66 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  f.  int readOnly
2e310 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
2e320 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2e330 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
2e340 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
2e350 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
2e360 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2e370 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
2e380 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
2e390 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
2e3a0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
2e3b0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
2e3c0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
2e3d0 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2e3e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2e3f0 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
2e400 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
2e410 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
2e420 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
2e430 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
2e440 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
2e450 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  l */.  int pcach
2e460 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
2e470 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
2e480 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2e490 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
2e4a0 68 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61  he */.  u32 szPa
2e4b0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2e4c0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2e4d0 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
2e4e0 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f  age size */.  co
2e4f0 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d  nst char *zUri =
2e500 20 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72   0;    /* URI ar
2e510 67 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  gs to copy */.  
2e520 69 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20  int nUri = 0;   
2e530 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e540 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55  er of bytes of U
2e550 52 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69  RI args at *zUri
2e560 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
2e570 20 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70   out how much sp
2e580 61 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ace is required 
2e590 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2e5a0 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a   file-handle.  *
2e5b0 2a 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f  * (there are two
2e5c0 20 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61   of them, the ma
2e5d0 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  in journal and t
2e5e0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e  he sub-journal).
2e5f0 20 20 2a 2f 0a 20 20 6a 6f 75 72 6e 61 6c 46 69    */.  journalFi
2e600 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28  leSize = ROUND8(
2e610 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
2e620 7a 65 28 70 56 66 73 29 29 3b 0a 0a 20 20 2f 2a  ze(pVfs));..  /*
2e630 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
2e640 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
2e650 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
2e660 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
2e670 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 23 69  ppPager = 0;..#i
2e680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e690 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28  T_MEMORYDB.  if(
2e6a0 20 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4d   flags & PAGER_M
2e6b0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 6d 65 6d  EMORY ){.    mem
2e6c0 44 62 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  Db = 1;.    if( 
2e6d0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
2e6e0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
2e6f0 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2e700 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 30  qlite3DbStrDup(0
2e710 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2e720 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d      if( zPathnam
2e730 65 3d 3d 30 20 20 29 20 72 65 74 75 72 6e 20 53  e==0  ) return S
2e740 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2e750 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61 6d  ;.      nPathnam
2e760 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2e770 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  n30(zPathname);.
2e780 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20        zFilename 
2e790 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 0;.    }.  }.#
2e7a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70  endif..  /* Comp
2e7b0 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
2e7c0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
2e7d0 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
2e7e0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
2e7f0 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
2e800 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
2e810 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
2e820 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
2e830 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
2e840 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
2e850 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
2e860 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
2e870 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
2e880 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
2e890 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2e8a0 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61   *z;.    nPathna
2e8b0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
2e8c0 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
2e8d0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2e8e0 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
2e8f0 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20  Pathname*2);.   
2e900 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d   if( zPathname==
2e910 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2e920 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
2e930 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  KPT;.    }.    z
2e940 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
2e950 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
2e960 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
2e970 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
2e980 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63   fails */.    rc
2e990 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
2e9a0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2e9b0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
2e9c0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
2e9d0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2e9e0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2e9f0 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  (zPathname);.   
2ea00 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69   z = zUri = &zFi
2ea10 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33 53 74  lename[sqlite3St
2ea20 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
2ea30 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  )+1];.    while(
2ea40 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b   *z ){.      z +
2ea50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2ea60 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20  0(z)+1;.      z 
2ea70 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
2ea80 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20  30(z)+1;.    }. 
2ea90 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74 29 28     nUri = (int)(
2eaa0 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20  &z[1] - zUri);. 
2eab0 20 20 20 61 73 73 65 72 74 28 20 6e 55 72 69 3e     assert( nUri>
2eac0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  =0 );.    if( rc
2ead0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
2eae0 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
2eaf0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
2eb00 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2eb10 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
2eb20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
2eb30 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
2eb40 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
2eb50 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
2eb60 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
2eb70 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
2eb80 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
2eb90 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
2eba0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
2ebb0 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
2ebc0 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
2ebd0 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
2ebe0 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2ebf0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
2ec00 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
2ec10 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
2ec20 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
2ec30 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
2ec40 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
2ec50 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
2ec60 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
2ec70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ec80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2ec90 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2eca0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
2ecb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ecc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
2ecd0 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
2ece0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
2ecf0 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62 6a 65  ure, PCache obje
2ed00 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74 68 72  ct, the.  ** thr
2ed10 65 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ee file descript
2ed20 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ors, the databas
2ed30 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  e file name and 
2ed40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
2ed50 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65  * file name. The
2ed60 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72   layout in memor
2ed70 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  y is as follows:
2ed80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50  .  **.  **     P
2ed90 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20 20 20  ager object     
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2edb0 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20 62 79  sizeof(Pager) by
2edc0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 50 43  tes).  **     PC
2edd0 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20 20 20  ache object     
2ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
2edf0 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65  qlite3PcacheSize
2ee00 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  () bytes).  **  
2ee10 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2ee20 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2ee30 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69     (pVfs->szOsFi
2ee40 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  le bytes).  **  
2ee50 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66     Sub-journal f
2ee60 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
2ee70 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53     (journalFileS
2ee80 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  ize bytes).  ** 
2ee90 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c      Main journal
2eea0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2eeb0 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65      (journalFile
2eec0 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  Size bytes).  **
2eed0 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2eee0 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
2eef0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
2ef00 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  1 bytes).  **   
2ef10 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e    Journal file n
2ef20 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2ef30 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31    (nPathname+8+1
2ef40 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70   bytes).  */.  p
2ef50 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  Ptr = (u8 *)sqli
2ef60 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
2ef70 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
2ef80 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20 20 20  (*pPager)) +    
2ef90 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
2efa0 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ture */.    ROUN
2efb0 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 20 2b  D8(pcacheSize) +
2efc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 43             /* PC
2efd0 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
2efe0 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e     ROUND8(pVfs->
2eff0 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20 20 20  szOsFile) +     
2f000 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62    /* The main db
2f010 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75   file */.    jou
2f020 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32  rnalFileSize * 2
2f030 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54   +          /* T
2f040 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
2f050 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
2f060 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2f070 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 7a  i +         /* z
2f080 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Filename */.    
2f090 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20  nPathname + 8 + 
2f0a0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2              /
2f0b0 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69  * zJournal */.#i
2f0c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f0d0 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74  T_WAL.    + nPat
2f0e0 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20 20 20  hname + 4 + 2   
2f0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c           /* zWal
2f100 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   */.#endif.  );.
2f110 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2f120 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
2f130 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2f140 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2f150 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
2f160 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
2f170 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e  DbFree(0, zPathn
2f180 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
2f190 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2f1a0 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  PT;.  }.  pPager
2f1b0 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
2f1c0 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a  (Pager*)(pPtr);.
2f1d0 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
2f1e0 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29  e =    (PCache*)
2f1f0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2f200 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2f210 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
2f220 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  =   (sqlite3_fil
2f230 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e  e*)(pPtr += ROUN
2f240 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b  D8(pcacheSize));
2f250 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
2f260 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
2f270 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
2f280 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
2f290 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64  );.  pPager->jfd
2f2a0 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c   =  (sqlite3_fil
2f2b0 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72  e*)(pPtr += jour
2f2c0 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20  nalFileSize);.  
2f2d0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2f2e0 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70  e =    (char*)(p
2f2f0 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69  Ptr += journalFi
2f300 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  leSize);.  asser
2f310 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2f320 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e  IGNMENT(pPager->
2f330 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  jfd) );..  /* Fi
2f340 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ll in the Pager.
2f350 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61  zFilename and Pa
2f360 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66  ger.zJournal buf
2f370 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65  fers, if require
2f380 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  d. */.  if( zPat
2f390 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  hname ){.    ass
2f3a0 65 72 74 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30  ert( nPathname>0
2f3b0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2f3c0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20 28 63 68  zJournal =   (ch
2f3d0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6e 50 61  ar*)(pPtr += nPa
2f3e0 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72  thname + 1 + nUr
2f3f0 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2f400 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f410 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2f420 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
2f430 20 6e 55 72 69 20 29 20 6d 65 6d 63 70 79 28 26   nUri ) memcpy(&
2f440 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2f450 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20  e[nPathname+1], 
2f460 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
2f470 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2f480 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
2f490 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2f4a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2f4b0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
2f4c0 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
2f4d0 6e 61 6c 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a  nal\000", 8+2);.
2f4e0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
2f4f0 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a  uffix3(pPager->z
2f500 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
2f510 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66  ->zJournal);.#if
2f520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f530 5f 57 41 4c 0a 20 20 20 20 70 50 61 67 65 72 2d  _WAL.    pPager-
2f540 3e 7a 57 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  >zWal = &pPager-
2f550 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2f560 61 6d 65 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65  ame+8+1];.    me
2f570 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 57 61  mcpy(pPager->zWa
2f580 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2f590 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2f5a0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 57  mcpy(&pPager->zW
2f5b0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
2f5c0 2d 77 61 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b  -wal\000", 4+1);
2f5d0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65  .    sqlite3File
2f5e0 53 75 66 66 69 78 33 28 70 50 61 67 65 72 2d 3e  Suffix3(pPager->
2f5f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
2f600 72 2d 3e 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66  r->zWal);.#endif
2f610 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2f620 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2f630 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
2f640 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
2f650 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
2f660 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
2f670 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
2f680 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
2f690 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
2f6a0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20  Filename[0] ){. 
2f6b0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
2f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6d0 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
2f6e0 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
2f6f0 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
2f700 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
2f710 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
2f720 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2f730 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
2f740 6f 75 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74  out);.    assert
2f750 28 20 21 6d 65 6d 44 62 20 29 3b 0a 23 69 66 64  ( !memDb );.#ifd
2f760 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2f770 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 20  _DESERIALIZE.   
2f780 20 6d 65 6d 4a 4d 20 3d 20 28 66 6f 75 74 26 53   memJM = (fout&S
2f790 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
2f7a0 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 20 20  Y)!=0;.#endif.  
2f7b0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
2f7c0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
2f7d0 45 41 44 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20  EADONLY)!=0;..  
2f7e0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
2f7f0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2f800 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
2f810 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
2f820 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
2f830 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2f840 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
2f850 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
2f860 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2f870 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
2f880 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
2f890 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
2f8a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2f8b0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
2f8c0 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
2f8d0 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
2f8e0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
2f8f0 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
2f900 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
2f910 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
2f920 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
2f930 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
2f940 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
2f950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
2f970 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
2f980 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
2f990 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
2f9a0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 65 61  ;.      if( !rea
2f9b0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
2f9c0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
2f9d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
2f9e0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 44 45  assert(SQLITE_DE
2f9f0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
2fa00 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2fa10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a  ULT_PAGE_SIZE);.
2fa20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61          if( szPa
2fa30 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73  geDflt<pPager->s
2fa40 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
2fa50 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2fa60 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51  r->sectorSize>SQ
2fa70 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2fa80 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
2fa90 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2faa0 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
2fab0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2fac0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  IZE;.          }
2fad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2fae0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28    szPageDflt = (
2faf0 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74  u32)pPager->sect
2fb00 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  orSize;.        
2fb10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 69    }.        }.#i
2fb20 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2fb30 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2fb40 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
2fb50 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2fb60 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2fb70 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2fb80 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
2fb90 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2fba0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2fbb0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
2fbc0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2fbd0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
2fbe0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2fbf0 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
2fc00 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
2fc10 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
2fc20 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2fc30 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
2fc40 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
2fc50 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
2fc60 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
2fc70 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20  ii>>8)) ){.     
2fc80 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2fc90 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  flt = ii;.      
2fca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fcb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
2fcc0 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
2fcd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
2fce0 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  k = sqlite3_uri_
2fcf0 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d  boolean(zFilenam
2fd00 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30 29 3b  e, "nolock", 0);
2fd10 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 63 20  .      if( (iDc 
2fd20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 49  & SQLITE_IOCAP_I
2fd30 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20 20 20  MMUTABLE)!=0.   
2fd40 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 75      || sqlite3_u
2fd50 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2fd60 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62 6c 65  name, "immutable
2fd70 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
2fd80 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 53     vfsFlags |= S
2fd90 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2fda0 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20 20 67  NLY;.          g
2fdb0 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  oto act_like_tem
2fdc0 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  p_file;.      }.
2fdd0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2fde0 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
2fdf0 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
2fe00 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
2fe10 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
2fe20 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
2fe30 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
2fe40 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
2fe50 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
2fe60 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
2fe70 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
2fe80 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
2fe90 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
2fea0 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  rite()..    **. 
2feb0 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2fec0 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f  h is also run fo
2fed0 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
2fee0 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d  atabase. An in-m
2fef0 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74  emory.    ** dat
2ff00 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d  abase is the sam
2ff10 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  e as a temp-file
2ff20 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77   that is never w
2ff30 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20  ritten out to.  
2ff40 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73    ** disk and us
2ff50 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  es an in-memory 
2ff60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2ff70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2ff80 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c 73 6f  This branch also
2ff90 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65 73 20   runs for files 
2ffa0 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75 74 61  marked as immuta
2ffb0 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61 63 74  ble..    */ .act
2ffc0 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3a  _like_temp_file:
2ffd0 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
2ffe0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  1;.    pPager->e
2fff0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  State = PAGER_RE
30000 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50 72 65  ADER;     /* Pre
30010 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64 79 20  tend we already 
30020 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  have a lock */. 
30030 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
30040 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43   = EXCLUSIVE_LOC
30050 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64  K;    /* Pretend
30060 20 77 65 20 61 72 65 20 69 6e 20 45 58 43 4c 55   we are in EXCLU
30070 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  SIVE mode */.   
30080 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
30090 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
300a0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c 6f 63      /* Do no loc
300b0 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65 61 64  king */.    read
300c0 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73  Only = (vfsFlags
300d0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
300e0 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DONLY);.  }..  /
300f0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
30100 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
30110 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
30120 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
30130 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
30140 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
30150 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
30160 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
30170 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
30180 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30190 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
301a0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
301b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
301c0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
301d0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
301e0 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20  ageDflt, -1);.  
301f0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
30200 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
30210 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
30220 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62 6a  e the PCache obj
30230 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ect. */.  if( rc
30240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30250 20 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e     nExtra = ROUN
30260 44 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  D8(nExtra);.    
30270 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
30280 38 20 26 26 20 6e 45 78 74 72 61 3c 31 30 30 30  8 && nExtra<1000
30290 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
302a0 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73  ite3PcacheOpen(s
302b0 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72  zPageDflt, nExtr
302c0 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20  a, !memDb,.     
302d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302e0 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74    !memDb?pagerSt
302f0 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29  ress:0, (void *)
30300 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
30310 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20  pPCache);.  }.. 
30320 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
30330 6f 63 63 75 72 72 65 64 20 61 62 6f 76 65 2c 20  occurred above, 
30340 66 72 65 65 20 74 68 65 20 20 50 61 67 65 72 20  free the  Pager 
30350 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
30360 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
30370 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  */.  if( rc!=SQL
30380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
30390 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
303a0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
303b0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
303c0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
303d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
303e0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ee(pPager);.    
303f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
30400 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f    PAGERTRACE(("O
30410 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49  PEN %d %s\n", FI
30420 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65  LEHANDLEID(pPage
30430 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e  r->fd), pPager->
30440 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49  zFilename));.  I
30450 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
30460 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
30470 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
30480 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75  e))..  pPager->u
30490 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  seJournal = (u8)
304a0 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 2f 2a  useJournal;.  /*
304b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
304c0 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
304d0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
304e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
304f0 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
30500 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
30510 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  stmtSize = 0; */
30520 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
30530 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  mtJSize = 0; */.
30540 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61    /* pPager->nPa
30550 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ge = 0; */.  pPa
30560 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
30570 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
30580 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  UNT;.  /* pPager
30590 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
305a0 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20  UNLOCK; */.  /* 
305b0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
305c0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
305d0 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38  ->tempFile = (u8
305e0 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73  )tempFile;.  ass
305f0 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50  ert( tempFile==P
30600 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30610 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20  _NORMAL .       
30620 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d     || tempFile==
30630 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
30640 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
30650 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
30660 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
30670 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61  SIVE==1 );.  pPa
30680 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
30690 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c  de = (u8)tempFil
306a0 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68  e; .  pPager->ch
306b0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
306c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
306d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  ;.  pPager->memD
306e0 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  b = (u8)memDb;. 
306f0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
30700 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79  y = (u8)readOnly
30710 3b 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  ;.  assert( useJ
30720 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
30730 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
30740 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
30750 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
30760 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  e;.  if( pPager-
30770 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  >noSync ){.    a
30780 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
30790 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  ullSync==0 );.  
307a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
307b0 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d 30 20 29  ->extraSync==0 )
307c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
307d0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d  ager->syncFlags=
307e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
307f0 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  ( pPager->walSyn
30800 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d  cFlags==0 );.  }
30810 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
30820 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a  ->fullSync = 1;.
30830 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
30840 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  aSync = 0;.    p
30850 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
30860 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
30870 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65  ORMAL;.    pPage
30880 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
30890 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
308a0 52 4d 41 4c 20 7c 20 28 53 51 4c 49 54 45 5f 53  RMAL | (SQLITE_S
308b0 59 4e 43 5f 4e 4f 52 4d 41 4c 3c 3c 32 29 3b 0a  YNC_NORMAL<<2);.
308c0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
308d0 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
308e0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
308f0 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
30900 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
30910 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
30920 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
30930 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20 20 70  (u16)nExtra;.  p
30940 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
30950 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
30960 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
30970 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
30980 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
30990 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
309a0 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
309b0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
309c0 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f 75 72  ;.  if( !useJour
309d0 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  nal ){.    pPage
309e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
309f0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
30a00 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 20  DE_OFF;.  }else 
30a10 69 66 28 20 6d 65 6d 44 62 20 7c 7c 20 6d 65 6d  if( memDb || mem
30a20 4a 4d 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  JM ){.    pPager
30a30 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
30a40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30a50 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
30a60 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
30a70 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
30a80 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
30a90 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
30aa0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
30ab0 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
30ac0 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d  it;.  setGetterM
30ad0 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20  ethod(pPager);. 
30ae0 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
30af0 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
30b00 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
30b10 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  h)); */.  /* pPa
30b20 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51  ger->szMmap = SQ
30b30 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41  LITE_DEFAULT_MMA
30b40 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62  P_SIZE // will b
30b50 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
30b60 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
30b70 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
30b80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
30b90 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
30ba0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30bb0 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f   after transitio
30bc0 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f  ning from PAGER_
30bd0 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47  UNLOCK to.** PAG
30be0 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e  ER_SHARED state.
30bf0 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65   It tests if the
30c00 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
30c10 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  nal present in.*
30c20 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
30c30 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  m for the given 
30c40 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75  pager. A hot jou
30c50 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
30c60 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65   .** needs to be
30c70 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63   played back. Ac
30c80 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20  cording to this 
30c90 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d  function, a hot-
30ca0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
30cb0 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f  exists if the fo
30cc0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
30cd0 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20   are met:.**.** 
30ce0 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
30cf0 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74  file exists in t
30d00 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  he file system, 
30d10 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72  and.**   * No pr
30d20 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45  ocess holds a RE
30d30 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65  SERVED or greate
30d40 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  r lock on the da
30d50 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64  tabase file, and
30d60 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61  .**   * The data
30d70 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
30d80 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
30d90 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   0 bytes in size
30da0 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
30db0 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
30dc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30dd0 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
30de0 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66  t 0x00..**.** If
30df0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
30e00 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
30e10 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20  e file is 0 but 
30e20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  a journal file.*
30e30 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69  * exists, that i
30e40 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c  s probably an ol
30e50 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f  d journal left o
30e60 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ver from a prior
30e70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74  .** database wit
30e80 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
30e90 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
30ea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
30eb0 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65  s.** just delete
30ec0 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65  d using OsDelete
30ed0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
30ee0 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
30ef0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
30f00 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
30f10 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
30f20 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   check if there 
30f30 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  is a master jour
30f40 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20  nal filename.** 
30f50 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
30f60 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
30f70 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61   is, and that ma
30f80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
30f90 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78  e.** does not ex
30fa0 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ist, then the jo
30fb0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
30fc0 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e  t really hot. In
30fd0 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68   this.** case th
30fe0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
30ff0 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70  return a false-p
31000 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67  ositive. The pag
31010 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a  er_playback().**
31020 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
31030 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20  scover that the 
31040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
31050 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
31060 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  nd .** will not 
31070 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a  roll it back. .*
31080 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
31090 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
310a0 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
310b0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
310c0 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
310d0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
310e0 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
310f0 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
31100 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
31110 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
31120 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
31130 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
31140 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
31150 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
31160 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
31170 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
31180 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
31190 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
311a0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
311b0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
311c0 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
311d0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
311e0 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
311f0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
31200 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
31210 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
31220 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
31230 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
31240 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
31250 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  K;           /* 
31260 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
31270 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b   int exists = 1;
31280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31290 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
312a0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
312b0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e  ent */.  int jrn
312c0 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e  lOpen = !!isOpen
312d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a  (pPager->jfd);..
312e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
312f0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
31300 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
31310 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
31320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31330 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
31340 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72  OPEN );..  asser
31350 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c  t( jrnlOpen==0 |
31360 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76  | ( sqlite3OsDev
31370 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
31380 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  cs(pPager->jfd) 
31390 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43  &.    SQLITE_IOC
313a0 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
313b0 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a  HEN_OPEN.  ));..
313c0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
313d0 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20    if( !jrnlOpen 
313e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
313f0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
31400 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
31410 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  al, SQLITE_ACCES
31420 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74  S_EXISTS, &exist
31430 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  s);.  }.  if( rc
31440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
31450 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74  xists ){.    int
31460 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20   locked = 0;    
31470 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
31480 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73   if some process
31490 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
314a0 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f  D lock */..    /
314b0 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  * Race condition
314c0 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20   here:  Another 
314d0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61  process might ha
314e0 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20  ve been holding 
314f0 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52  the.    ** the R
31500 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64  ESERVED lock and
31510 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20   have a journal 
31520 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69  open at the sqli
31530 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20  te3OsAccess() . 
31540 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65     ** call above
31550 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74  , but then delet
31560 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  e the journal an
31570 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20  d drop the lock 
31580 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65  before.    ** we
31590 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c   get to the foll
315a0 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43  owing sqlite3OsC
315b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
315c0 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61  () call.  If tha
315d0 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20  t.    ** is the 
315e0 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69  case, this routi
315f0 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74  ne might think t
31600 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
31610 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a  urnal when.    *
31620 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20  * in fact there 
31630 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72  is none.  This r
31640 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73  esults in a fals
31650 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68  e-positive which
31660 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
31670 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
31680 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69  e playback routi
31690 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38  ne.  Ticket #388
316a0 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  3..    */.    rc
316b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
316c0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
316d0 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
316e0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
316f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
31700 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67  cked ){.      Pg
31710 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
31720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31730 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
31740 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
31750 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
31760 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31770 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
31780 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
31790 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
317a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
317b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
317c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
317d0 61 74 61 62 61 73 65 20 69 73 20 7a 65 72 6f 20  atabase is zero 
317e0 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  pages in size, t
317f0 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 65  hat means that e
31800 69 74 68 65 72 20 28 31 29 20 74 68 65 0a 20 20  ither (1) the.  
31810 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
31820 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20 66 72   is a remnant fr
31830 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74 61 62  om a prior datab
31840 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
31850 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20 20 20  e name where.   
31860 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
31870 62 61 73 65 20 66 69 6c 65 20 62 75 74 20 6e 6f  base file but no
31880 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  t the journal wa
31890 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20 28 32  s deleted, or (2
318a0 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 20 20  ) the initial.  
318b0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
318c0 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75 6c 61  tion that popula
318d0 74 65 73 20 61 20 6e 65 77 20 64 61 74 61 62 61  tes a new databa
318e0 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  se is being roll
318f0 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ed back..       
31900 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63 61   ** In either ca
31910 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  se, the journal 
31920 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65 6c 65  file can be dele
31930 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 74  ted.  However, t
31940 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20 20 20  ake care.       
31950 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c 65 74   ** not to delet
31960 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
31970 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  le if it is alre
31980 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74 6f 0a  ady open due to.
31990 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
319a0 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 2e  al_mode=PERSIST.
319b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
319c0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
319d0 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b   && !jrnlOpen ){
319e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
319f0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
31a00 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 20  loc();.         
31a10 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b 44 62   if( pagerLockDb
31a20 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
31a30 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54 45 5f  D_LOCK)==SQLITE_
31a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
31a50 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
31a60 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  e(pVfs, pPager->
31a70 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
31a80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
31a90 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
31aa0 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e 6c 6f  Mode ) pagerUnlo
31ab0 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41  ckDb(pPager, SHA
31ac0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
31ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31ae0 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
31af0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
31b00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31b10 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
31b20 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
31b30 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
31b40 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
31b50 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
31b60 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
31b70 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
31b80 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
31b90 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
31ba0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
31bb0 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
31bc0 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
31bd0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
31be0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
31bf0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
31c00 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
31c10 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
31c20 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
31c30 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
31c40 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
31c50 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
31c60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
31c70 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a  f( !jrnlOpen ){.
31c80 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
31c90 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
31ca0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
31cb0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
31cc0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
31cd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
31ce0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
31cf0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31d00 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
31d10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31d20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31d30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31d40 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
31d50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
31d60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
31d70 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
31d80 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
31d90 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
31da0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31db0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
31dc0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
31dd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31de0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
31df0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
31e00 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
31e10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31e20 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31e30 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31e50 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
31e60 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
31e70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
31e80 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
31e90 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
31ea0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
31eb0 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
31ec0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
31ed0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
31ee0 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
31ef0 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
31f00 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
31f10 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
31f20 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
31f30 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
31f40 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
31f50 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
31f60 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
31f70 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
31f80 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
31f90 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
31fa0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
31fb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
31fc0 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
31fd0 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
31fe0 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
31ff0 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
32000 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
32010 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
32020 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
32030 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
32040 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
32050 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
32060 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
32070 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
32080 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
32090 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
320a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
320b0 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
320c0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
320d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
320e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
320f0 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
32100 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32110 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
32120 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
32140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
32150 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
32160 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
32170 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
32180 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
32190 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
321a0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
321b0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
321c0 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65  Get() until afte
321d0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
321e0 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
321f0 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
32200 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
32210 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
32220 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
32230 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
32240 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
32250 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
32260 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
32270 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
32280 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
32290 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
322a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
322b0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
322c0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
322d0 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
322e0 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
322f0 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
32300 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
32310 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
32320 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
32330 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
32340 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
32350 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
32360 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
32370 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
32380 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
32390 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
323a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
323b0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
323c0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
323d0 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
323e0 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
323f0 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
32400 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
32410 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
32420 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
32430 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
32440 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
32450 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
32460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
32470 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
32480 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
32490 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
324a0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
324b0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
324c0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
324d0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
324e0 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
324f0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
32500 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
32510 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
32520 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
32530 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
32540 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
32550 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
32560 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
32570 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
32580 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
32590 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
325a0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
325b0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
325c0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
325d0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
325e0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
325f0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
32600 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
32610 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
32620 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
32630 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
32640 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
32650 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
32660 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
32670 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
32680 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
32690 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
326a0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
326b0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
326c0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
326d0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
326e0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
326f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
32700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
32710 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
32720 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
32730 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
32740 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
32750 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
32760 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
32770 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
32780 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
32790 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
327a0 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
327b0 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
327c0 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
327d0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
327e0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
327f0 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
32800 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
32810 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  de.  */.  assert
32820 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
32830 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
32840 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
32850 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
32860 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
32870 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
32880 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
32890 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
328a0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
328b0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
328c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
328d0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
328e0 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  _OK );..  if( !p
328f0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32900 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
32910 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32920 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
32930 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
32940 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
32950 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
32960 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
32970 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
32980 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
32990 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
329a0 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
329b0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
329c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
329d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
329e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
329f0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
32a00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32a20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32a30 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
32a40 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
32a50 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
32a60 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
32a70 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
32a80 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
32a90 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
32aa0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
32ab0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
32ac0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
32ad0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
32ae0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
32af0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
32b00 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
32b10 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
32b20 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
32b30 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
32b40 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
32b50 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
32b60 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
32b70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
32b90 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
32ba0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
32bb0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
32bc0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
32bd0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
32be0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
32bf0 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
32c00 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32c10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32c20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
32c30 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
32c50 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
32c60 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
32c70 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
32c80 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
32c90 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
32ca0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
32cb0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
32cc0 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
32cd0 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
32ce0 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
32cf0 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
32d00 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
32d10 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
32d20 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
32d30 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
32d40 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
32d50 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
32d60 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
32d70 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
32d80 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
32d90 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
32da0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
32db0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
32dc0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
32dd0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
32de0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
32df0 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
32e00 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
32e10 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
32e20 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
32e30 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
32e40 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
32e50 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
32e60 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
32e70 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
32e80 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
32e90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
32ea0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
32eb0 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
32ec0 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
32ed0 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
32ee0 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
32ef0 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
32f00 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
32f10 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
32f20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32f30 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
32f40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
32f50 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
32f60 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
32f70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
32f80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32f90 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
32fa0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
32fb0 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
32fc0 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
32fd0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
32fe0 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
32ff0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
33000 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
33010 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
33020 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
33030 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
33040 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
33050 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
33060 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
33070 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
33080 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
33090 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
330a0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
330b0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
330c0 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
330d0 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
330e0 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
330f0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
33100 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
33110 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
33120 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
33130 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
33140 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
33150 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
33160 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
33170 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
33180 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
33190 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
331a0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
331b0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
331c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
331d0 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
331e0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
331f0 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
33200 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
33210 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
33220 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
33230 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
33240 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
33250 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
33260 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
33270 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
33280 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
33290 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
332a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
332b0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
332c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
332d0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
332e0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
332f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
33300 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
33310 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
33320 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
33330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
33340 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
33350 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
33360 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33370 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
33380 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
33390 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
333a0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
333b0 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
333c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
333d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
333e0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
333f0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
33400 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
33410 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
33420 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
33430 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
33440 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  L;.          ass
33450 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
33460 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
33470 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33480 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
33490 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
334a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26  Pager->jfd, f, &
334b0 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  fout);.         
334c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
334d0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
334e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
334f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
33500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
33510 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
33520 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
33530 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
33540 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
33550 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
33560 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
33570 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
33580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33590 20 7d 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20   }.      }. .   
335a0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
335b0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
335c0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
335d0 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
335e0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
335f0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
33600 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65  read lock. Purge
33610 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72   the cache befor
33620 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69  e.      ** playi
33630 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d  ng back the hot-
33640 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20  journal so that 
33650 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20  we don't end up 
33660 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e  with.      ** an
33670 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
33680 63 68 65 2e 20 20 53 79 6e 63 20 74 68 65 20 68  che.  Sync the h
33690 6f 74 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot journal befor
336a0 65 20 70 6c 61 79 69 6e 67 0a 20 20 20 20 20 20  e playing.      
336b0 2a 2a 20 69 74 20 62 61 63 6b 20 73 69 6e 63 65  ** it back since
336c0 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
336d0 74 20 63 72 61 73 68 65 64 20 61 6e 64 20 6c 65  t crashed and le
336e0 66 74 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  ft the hot journ
336f0 61 6c 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  al.      ** prob
33700 61 62 6c 79 20 64 69 64 20 6e 6f 74 20 73 79 6e  ably did not syn
33710 63 20 69 74 20 61 6e 64 20 77 65 20 61 72 65 20  c it and we are 
33720 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c 77 61  required to alwa
33730 79 73 20 73 79 6e 63 0a 20 20 20 20 20 20 2a 2a  ys sync.      **
33740 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
33750 6f 72 65 20 70 6c 61 79 69 6e 67 20 69 74 20 62  ore playing it b
33760 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ack..      */.  
33770 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
33780 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
33790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
337a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
337b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
337c0 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c  erSyncHotJournal
337d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
337e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
337f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
33800 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
33810 62 61 63 6b 28 70 50 61 67 65 72 2c 20 21 70 50  back(pPager, !pP
33820 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
33830 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
33840 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
33850 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  R_OPEN;.        
33860 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
33870 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
33880 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
33890 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44      pagerUnlockD
338a0 62 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  b(pPager, SHARED
338b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
338c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
338d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
338e0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
338f0 63 68 20 69 73 20 74 61 6b 65 6e 20 69 66 20 61  ch is taken if a
33900 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
33910 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6f  hile trying to o
33920 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
33930 72 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 68 6f  r roll back a ho
33940 74 2d 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 20  t-journal while 
33950 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
33960 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20  SIVE lock. The. 
33970 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
33980 75 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65  unlock() routine
33990 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
339a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
339b0 20 74 6f 20 75 6e 6c 6f 63 6b 0a 20 20 20 20 20   to unlock.     
339c0 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 2e 20     ** the file. 
339d0 49 66 20 74 68 65 20 75 6e 6c 6f 63 6b 20 61 74  If the unlock at
339e0 74 65 6d 70 74 20 66 61 69 6c 73 2c 20 74 68 65  tempt fails, the
339f0 6e 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 6d 75  n Pager.eLock mu
33a00 73 74 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  st be.        **
33a10 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
33a20 4c 4f 43 4b 20 28 73 65 65 20 74 68 65 20 63 6f  LOCK (see the co
33a30 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
33a40 23 64 65 66 69 6e 65 20 66 6f 72 20 0a 20 20 20  #define for .   
33a50 20 20 20 20 20 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f       ** UNKNOWN_
33a60 4c 4f 43 4b 20 61 62 6f 76 65 20 66 6f 72 20 61  LOCK above for a
33a70 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 29 2e 20  n explanation). 
33a80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
33a90 20 20 20 20 2a 2a 20 49 6e 20 6f 72 64 65 72 20      ** In order 
33aa0 74 6f 20 67 65 74 20 70 61 67 65 72 5f 75 6e 6c  to get pager_unl
33ab0 6f 63 6b 28 29 20 74 6f 20 64 6f 20 74 68 69 73  ock() to do this
33ac0 2c 20 73 65 74 20 50 61 67 65 72 2e 65 53 74 61  , set Pager.eSta
33ad0 74 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  te to.        **
33ae0 20 50 41 47 45 52 5f 45 52 52 4f 52 20 6e 6f 77   PAGER_ERROR now
33af0 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
33b00 74 75 61 6c 6c 79 20 63 6f 75 6e 74 65 64 20 61  tually counted a
33b10 73 20 61 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20  s a transition. 
33b20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 45 52 52         ** to ERR
33b30 4f 52 20 73 74 61 74 65 20 69 6e 20 74 68 65 20  OR state in the 
33b40 73 74 61 74 65 20 64 69 61 67 72 61 6d 20 61 74  state diagram at
33b50 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73   the top of this
33b60 20 66 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 2a   file,.        *
33b70 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20  * since we know 
33b80 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 61  that the same ca
33b90 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
33ba0 63 6b 28 29 20 77 69 6c 6c 20 76 65 72 79 0a 20  ck() will very. 
33bb0 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 6c         ** shortl
33bc0 79 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 68 65  y transition the
33bd0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f   pager object to
33be0 20 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e   the OPEN state.
33bf0 20 43 61 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20   Calling.       
33c00 20 2a 2a 20 61 73 73 65 72 74 5f 70 61 67 65 72   ** assert_pager
33c10 5f 73 74 61 74 65 28 29 20 77 6f 75 6c 64 20 66  _state() would f
33c20 61 69 6c 20 6e 6f 77 2c 20 61 73 20 69 74 20 73  ail now, as it s
33c30 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 6f 73  hould not be pos
33c40 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a  sible.        **
33c50 20 74 6f 20 62 65 20 69 6e 20 45 52 52 4f 52 20   to be in ERROR 
33c60 73 74 61 74 65 20 77 68 65 6e 20 74 68 65 72 65  state when there
33c70 20 61 72 65 20 7a 65 72 6f 20 6f 75 74 73 74 61   are zero outsta
33c80 6e 64 69 6e 67 20 70 61 67 65 20 0a 20 20 20 20  nding page .    
33c90 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
33ca0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
33cb0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
33cc0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
33cd0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
33ce0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
33cf0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33d00 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33d10 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 61  _OPEN );.      a
33d20 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
33d30 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
33d40 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  CK).           |
33d50 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
33d60 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
33d70 65 72 2d 3e 65 4c 6f 63 6b 3e 53 48 41 52 45 44  er->eLock>SHARED
33d80 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 29 3b 0a  _LOCK).      );.
33d90 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
33da0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
33db0 20 26 26 20 70 50 61 67 65 72 2d 3e 68 61 73 48   && pPager->hasH
33dc0 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 29 7b  eldSharedLock ){
33dd0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
33de0 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
33df0 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
33e00 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 0a 20   then check to. 
33e10 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 74       ** see if t
33e20 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
33e30 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
33e40 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
33e50 68 61 73 20 63 68 61 6e 67 65 64 2c 0a 20 20 20  has changed,.   
33e60 20 20 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20     ** flush the 
33e70 63 61 63 68 65 2e 20 20 54 68 65 20 68 61 73 48  cache.  The hasH
33e80 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 66 6c  eldSharedLock fl
33e90 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 69 73  ag prevents this
33ea0 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 6f   from.      ** o
33eb0 63 63 75 72 72 69 6e 67 20 6f 6e 20 74 68 65 20  ccurring on the 
33ec0 76 65 72 79 20 66 69 72 73 74 20 61 63 63 65 73  very first acces
33ed0 73 20 74 6f 20 61 20 66 69 6c 65 2c 20 69 6e 20  s to a file, in 
33ee0 6f 72 64 65 72 20 74 6f 20 73 61 76 65 20 61 0a  order to save a.
33ef0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
33f00 75 6e 6e 65 63 65 73 73 61 72 79 20 73 71 6c 69  unnecessary sqli
33f10 74 65 33 4f 73 52 65 61 64 28 29 20 63 61 6c 6c  te3OsRead() call
33f20 20 61 74 20 74 68 65 20 73 74 61 72 74 2d 75 70   at the start-up
33f30 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
33f40 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61   ** Database cha
33f50 6e 67 65 73 20 61 72 65 20 64 65 74 65 63 74 65  nges are detecte
33f60 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
33f70 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
33f80 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
33f90 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
33fa0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
33fb0 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
33fc0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
33fd0 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
33fe0 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
33ff0 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
34000 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
34010 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
34020 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
34030 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
34040 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
34050 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
34060 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
34070 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
34080 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
34090 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
340a0 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
340b0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
340c0 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
340d0 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
340e0 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
340f0 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
34100 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
34110 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
34120 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
34130 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
34140 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
34150 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
34160 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
34170 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
34180 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
34190 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
341a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
341b0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
341c0 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
341d0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
341e0 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
341f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34200 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
34210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
34220 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
34230 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
34240 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
34250 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
34260 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
34270 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
34280 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
34290 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
342a0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
342b0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
342c0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
342d0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
342e0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
342f0 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ger);..        /
34300 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74 61  * Unmap the data
34310 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69 73  base file. It is
34320 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 65   possible that e
34330 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
34340 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79  s.        ** may
34350 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64 20   have truncated 
34360 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34370 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65 6e  e and then exten
34380 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20 20  ded it back.    
34390 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f 72      ** to its or
343a0 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69 6c  iginal size whil
343b0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 77  e this process w
343c0 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20 61  as not holding a
343d0 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
343e0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
343f0 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20 61  here may exist a
34400 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70 70   Pager.pMap mapp
34410 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72 73  ing that appears
34420 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  .        ** to b
34430 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  e the right size
34440 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74 75   but is not actu
34450 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f 69  ally valid. Avoi
34460 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  d this.        *
34470 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62 79  * possibility by
34480 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20 64   unmapping the d
34490 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  b here. */.     
344a0 20 20 20 69 66 28 20 55 53 45 46 45 54 43 48 28     if( USEFETCH(
344b0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
344c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
344d0 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  fetch(pPager->fd
344e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
344f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
34500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
34510 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c 65 20  e is a WAL file 
34520 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
34530 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20 64 61  em, open this da
34540 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a 20 20  tabase in WAL.  
34550 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72    ** mode. Other
34560 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  wise, the follow
34570 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ing function cal
34580 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  l is a no-op..  
34590 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
345a0 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73  gerOpenWalIfPres
345b0 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ent(pPager);.#if
345c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
345d0 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72 74 28  _WAL.    assert(
345e0 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d 30   pPager->pWal==0
345f0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
34600 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  K );.#endif.  }.
34610 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
34620 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
34630 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
34640 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72  LITE_OK );.    r
34650 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e 52 65  c = pagerBeginRe
34660 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
34670 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ager);.  }..  if
34680 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
34690 6c 65 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  le==0 && pPager-
346a0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
346b0 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  PEN && rc==SQLIT
346c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
346d0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
346e0 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
346f0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  >dbSize);.  }.. 
34700 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
34710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34720 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
34730 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f 75  B );.    pager_u
34740 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
34750 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34760 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
34770 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65  _OPEN );.  }else
34780 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  {.    pPager->eS
34790 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 41  tate = PAGER_REA
347a0 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  DER;.    pPager-
347b0 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
347c0 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ck = 1;.  }.  re
347d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
347e0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
347f0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
34800 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
34810 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
34820 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
34830 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
34840 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
34850 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
34860 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
34870 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
34880 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
34890 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
348a0 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
348b0 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
348c0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
348d0 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
348e0 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
348f0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
34900 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
34910 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
34920 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
34930 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50  {.  if( sqlite3P
34940 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
34950 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
34960 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
34970 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
34980 74 3d 3d 30 20 29 3b 20 2f 2a 20 62 65 63 61 75  t==0 ); /* becau
34990 73 65 20 70 61 67 65 31 20 69 73 20 6e 65 76 65  se page1 is neve
349a0 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  r memory mapped 
349b0 2a 2f 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  */.    pagerUnlo
349c0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
349d0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
349e0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  .** The page get
349f0 74 65 72 20 6d 65 74 68 6f 64 73 20 65 61 63 68  ter methods each
34a00 20 74 72 79 20 74 6f 20 61 63 71 75 69 72 65 20   try to acquire 
34a10 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
34a20 0a 2a 2a 20 70 61 67 65 20 77 69 74 68 20 70 61  .** page with pa
34a30 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20  ge number pgno. 
34a40 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
34a50 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a   reference is .*
34a60 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  * successfully o
34a70 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63  btained, it is c
34a80 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65  opied to *ppPage
34a90 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
34aa0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
34ab0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
34ac0 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
34ad0 6e 73 20 6f 66 20 74 68 65 20 67 65 74 74 65 72  ns of the getter
34ae0 20 6d 65 74 68 6f 64 20 64 65 70 65 6e 64 69 6e   method dependin
34af0 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72  g.** on the curr
34b00 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
34b10 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   pager..**.**   
34b20 20 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28    getPageNormal(
34b30 29 20 20 20 20 20 20 20 20 20 2d 2d 20 20 54 68  )         --  Th
34b40 65 20 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72 0a  e normal getter.
34b50 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 45 72  **     getPageEr
34b60 72 6f 72 28 29 20 20 20 20 20 20 20 20 20 20 2d  ror()          -
34b70 2d 20 20 55 73 65 64 20 69 66 20 74 68 65 20 70  -  Used if the p
34b80 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72  ager is in an er
34b90 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  ror state.**    
34ba0 20 67 65 74 50 61 67 65 4d 6d 61 70 28 29 20 20   getPageMmap()  
34bb0 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65           --  Use
34bc0 64 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  d if memory-mapp
34bd0 65 64 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65  ed I/O is enable
34be0 64 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  d.**.** If the r
34bf0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
34c00 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
34c10 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74  cache, it is ret
34c20 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
34c30 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65  wise, a new page
34c40 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
34c50 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74  ated and populat
34c60 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20  ed with data.** 
34c70 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
34c80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20  tabase file. In 
34c90 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20  some cases, the 
34ca0 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61  pcache module ma
34cb0 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20  y.** choose not 
34cc0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
34cd0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e  w page object an
34ce0 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65  d may reuse an e
34cf0 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63  xisting.** objec
34d00 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61  t with no outsta
34d10 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
34d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72  ..**.** The extr
34d30 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
34d40 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
34d50 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
34d60 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a  to zeros the .**
34d70 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61   first time a pa
34d80 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74  ge is loaded int
34d90 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65  o memory. If the
34da0 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20   page requested 
34db0 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  is .** already i
34dc0 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  n the cache when
34dd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34de0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74  s called, then t
34df0 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61  he extra.** data
34e00 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77   is left as it w
34e10 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  as when the page
34e20 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74   object was last
34e30 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
34e40 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
34e50 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ge is smaller th
34e60 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
34e70 20 70 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a 20   page or if .** 
34e80 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
34e90 74 65 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ter contains the
34ea0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
34eb0 54 45 4e 54 20 62 69 74 20 61 6e 64 20 74 68 65  TENT bit and the
34ec0 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
34ed0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
34ee0 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
34ef0 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
34f00 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
34f10 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
34f20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
34f30 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
34f40 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
34f50 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
34f60 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
34f70 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  f PAGER_GET_NOCO
34f80 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c 20 69  NTENT is true, i
34f90 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
34fa0 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
34fb0 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
34fc0 73 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54  s of the page. T
34fd0 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77  his occurs in tw
34fe0 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a  o scenarios:.**.
34ff0 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65 61  **   a) When rea
35000 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74  ding a free-list
35010 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20   leaf page from 
35020 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e  the database, an
35030 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65  d.**.**   b) Whe
35040 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
35050 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
35060 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  ck and we need t
35070 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61  o load.**      a
35080 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74   new page into t
35090 68 65 20 63 61 63 68 65 20 74 6f 20 62 65 20 66  he cache to be f
350a0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
350b0 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
350c0 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
350d0 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
350e0 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f  ** If PAGER_GET_
350f0 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75  NOCONTENT is tru
35100 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
35110 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
35120 6f 65 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f  oed instead.** o
35130 66 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  f being read fro
35140 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
35150 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
35160 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
35170 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
35180 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
35190 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
351a0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
351b0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
351c0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
351d0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
351e0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
351f0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
35200 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
35210 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
35220 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
35230 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
35240 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
35250 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
35260 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
35270 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
35280 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
35290 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
352a0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
352b0 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
352c0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
352d0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
352e0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
352f0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
35300 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
35310 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
35320 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
35330 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
35340 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
35350 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
35360 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
35370 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
35380 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
35390 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
353a0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
353b0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
353c0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
353d0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
353e0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
353f0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
35400 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
35410 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
35420 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
35430 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
35440 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
35450 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
35460 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
35470 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
35480 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
35490 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
354a0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
354b0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
354c0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
354d0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
354e0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
354f0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
35500 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
35510 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iles..*/.static 
35520 69 6e 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61  int getPageNorma
35530 6c 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  l(.  Pager *pPag
35540 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
35550 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
35560 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35570 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
35580 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
35590 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
355a0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
355b0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
355c0 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
355d0 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
355e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
355f0 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
35600 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  GET_XXX flags */
35610 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
35620 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
35630 72 20 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f 43  r *pPg;.  u8 noC
35640 6f 6e 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20  ontent;         
35650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
35660 65 20 69 66 20 50 41 47 45 52 5f 47 45 54 5f 4e  e if PAGER_GET_N
35670 4f 43 4f 4e 54 45 4e 54 20 69 73 20 73 65 74 20  OCONTENT is set 
35680 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61  */.  sqlite3_pca
35690 63 68 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b  che_page *pBase;
356a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
356b0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
356c0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
356d0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
356e0 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
356f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
35700 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
35710 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
35720 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61  sert( pPager->ha
35730 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d  sHeldSharedLock=
35740 3d 31 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  =1 );..#ifndef S
35750 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4e 43 55  QLITE_OMIT_CONCU
35760 52 52 45 4e 54 0a 20 20 2f 2a 20 49 66 20 74 68  RRENT.  /* If th
35770 69 73 20 69 73 20 61 6e 20 43 4f 4e 43 55 52 52  is is an CONCURR
35780 45 4e 54 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ENT transaction 
35790 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65 69  and the page bei
357a0 6e 67 20 72 65 61 64 20 77 61 73 0a 20 20 2a 2a  ng read was.  **
357b0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
357c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
357d0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
357e0 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2c 0a 20  on was opened,. 
357f0 20 2a 2a 20 6d 61 72 6b 20 69 74 20 61 73 20 72   ** mark it as r
35800 65 61 64 20 69 6e 20 74 68 65 20 70 41 6c 6c 52  ead in the pAllR
35810 65 61 64 20 76 65 63 74 6f 72 2e 20 20 2a 2f 0a  ead vector.  */.
35820 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 69 66 28    pPg = 0;.  if(
35830 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 52 65 61   pPager->pAllRea
35840 64 20 26 26 20 70 67 6e 6f 3c 3d 70 50 61 67 65  d && pgno<=pPage
35850 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
35860 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
35870 28 22 55 53 49 4e 47 20 70 61 67 65 20 25 64 5c  ("USING page %d\
35880 6e 22 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  n", pgno));.    
35890 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
358a0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41  ecSet(pPager->pA
358b0 6c 6c 52 65 61 64 2c 20 70 67 6e 6f 29 3b 0a 20  llRead, pgno);. 
358c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
358d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
358e0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
358f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
35900 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72   pgno==0 ) retur
35910 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
35920 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65 20 3d  _BKPT;.  pBase =
35930 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
35940 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
35950 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 20  che, pgno, 3);. 
35960 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
35970 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
35980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
35990 61 63 68 65 46 65 74 63 68 53 74 72 65 73 73 28  acheFetchStress(
359a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
359b0 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29 3b 0a   pgno, &pBase);.
359c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
359d0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
359e0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
359f0 20 20 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30      if( pBase==0
35a00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
35a10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
35a20 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
35a30 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
35a40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 67 20      }.  }.  pPg 
35a50 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71 6c 69  = *ppPage = sqli
35a60 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46 69  te3PcacheFetchFi
35a70 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43  nish(pPager->pPC
35a80 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42 61 73  ache, pgno, pBas
35a90 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
35aa0 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a  g==(*ppPage) );.
35ab0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
35ac0 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
35ad0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
35ae0 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50  er==pPager || pP
35af0 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  g->pPager==0 );.
35b00 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  .  noContent = (
35b10 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
35b20 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d 30 3b  T_NOCONTENT)!=0;
35b30 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67  .  if( pPg->pPag
35b40 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74  er && !noContent
35b50 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68   ){.    /* In th
35b60 69 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63  is case the pcac
35b70 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61  he already conta
35b80 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a  ins an initializ
35b90 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a  ed copy of.    *
35ba0 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75  * the page. Retu
35bb0 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68  rn without furth
35bc0 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20  er ado.  */.    
35bd0 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41  assert( pgno<=PA
35be0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20  GER_MAX_PGNO && 
35bf0 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
35c00 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
35c10 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74     pPager->aStat
35c20 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d  [PAGER_STAT_HIT]
35c30 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ++;.    return S
35c40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c  QLITE_OK;..  }el
35c50 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  se{.    /* The p
35c60 61 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63  ager cache has c
35c70 72 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67  reated a new pag
35c80 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e  e. Its content n
35c90 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20  eeds to .    ** 
35ca0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
35cb0 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65 20 65  But first some e
35cc0 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20 20 20  rror checks:.   
35cd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29 20 54   **.    ** (1) T
35ce0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
35cf0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 0a 20  number is 2^31. 
35d00 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65 72 20     ** (2) Never 
35d10 74 72 79 20 74 6f 20 66 65 74 63 68 20 74 68 65  try to fetch the
35d20 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a 20 20   locking page.  
35d30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e    */.    if( pgn
35d40 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
35d50 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
35d60 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
35d70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35d80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35d90 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
35da0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35db0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d  .    }..    pPg-
35dc0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
35dd0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ;..    assert( !
35de0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
35df0 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  d) || !MEMDB );.
35e00 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
35e10 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
35e20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
35e30 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
35e40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
35e50 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
35e60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
35e70 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
35e80 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
35e90 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
35ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
35eb0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
35ec0 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
35ed0 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
35ee0 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
35ef0 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
35f00 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
35f10 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
35f20 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
35f30 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
35f40 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
35f50 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
35f60 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
35f70 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
35f80 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
35f90 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
35fa0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
35fb0 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
35fc0 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
35fd0 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
35fe0 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
35ff0 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
36000 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
36010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
36020 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
36030 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
36040 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
36050 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
36060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
36070 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
36080 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
36090 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
360a0 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
360b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
360c0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
360d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
360e0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
360f0 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
36100 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
36110 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
36120 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
36130 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
36140 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
36150 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
36160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
36170 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
36180 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
36190 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
361a0 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
361b0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
361c0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
361d0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
361e0 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
361f0 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70  Pager );.      p
36200 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
36210 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b  ER_STAT_MISS]++;
36220 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
36230 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  DbPage(pPg);.   
36240 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
36260 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
36270 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
36280 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
36290 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
362a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
362b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
362c0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a 20  r_acquire_err:. 
362d0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
362e0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
362f0 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pPg ){.    sqlit
36300 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
36310 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
36320 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
36330 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  ger);.  *ppPage 
36340 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
36350 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
36360 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
36370 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
36380 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65 6d 6f  er for when memo
36390 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
363a0 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74 61 74   enabled */.stat
363b0 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 4d 4d  ic int getPageMM
363c0 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ap(.  Pager *pPa
363d0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
363e0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
363f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36400 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
36410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
36420 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
36430 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
36440 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
36450 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
36460 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
36470 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
36480 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
36490 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
364a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
364b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
364c0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 75  dr *pPg = 0;.  u
364d0 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
364e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
364f0 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61 64 20  * Frame to read 
36500 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20 2a 2f  from WAL file */
36510 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63  ..  /* It is acc
36520 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61  eptable to use a
36530 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70   read-only (mmap
36540 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70  ) page for any p
36550 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20  age except.  ** 
36560 70 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20  page 1 if there 
36570 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
36580 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20  saction open or 
36590 74 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44  the ACQUIRE_READ
365a0 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77  ONLY.  ** flag w
365b0 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20  as specified by 
365c0 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20  the caller. And 
365d0 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64  so long as the d
365e0 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a  b is not a .  **
365f0 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e   temporary or in
36600 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
36610 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  .  */.  const in
36620 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e  t bMmapOk = (pgn
36630 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61 67 65  o>1.   && (pPage
36640 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36650 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61 67  _READER || (flag
36660 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52 45  s & PAGER_GET_RE
36670 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a 0a 20  ADONLY)).  );.. 
36680 20 61 73 73 65 72 74 28 20 55 53 45 46 45 54 43   assert( USEFETC
36690 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66  H(pPager) );.#if
366a0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
366b0 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28 20 70  ODEC.  assert( p
366c0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30  Pager->xCodec==0
366d0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
366e0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
366f0 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
36700 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
36710 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
36720 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
36730 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
36740 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
36750 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
36760 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
36770 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
36780 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
36790 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
367a0 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
367b0 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
367c0 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
367d0 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
367e0 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
367f0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
36800 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
36810 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
36820 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36830 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
36840 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
36850 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
36860 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
36870 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36880 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63  hasHeldSharedLoc
36890 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
368a0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
368b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
368c0 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26  .  if( bMmapOk &
368d0 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
368e0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20  ager) ){.    rc 
368f0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
36900 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
36910 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d  al, pgno, &iFram
36920 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
36930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36940 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
36950 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
36960 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
36970 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61   bMmapOk && iFra
36980 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76 6f 69  me==0 ){.    voi
36990 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  d *pData = 0;.  
369a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
369b0 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64  Fetch(pPager->fd
369c0 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36 34 29  , .        (i64)
369d0 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65  (pgno-1) * pPage
369e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61  r->pageSize, pPa
369f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26  ger->pageSize, &
36a00 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20 20 20  pData.    );.   
36a10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36a20 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20  OK && pData ){. 
36a30 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
36a40 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45  >eState>PAGER_RE
36a50 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ADER || pPager->
36a60 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
36a70 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
36a80 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
36a90 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
36aa0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
36ab0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
36ac0 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72  rc = pagerAcquir
36ad0 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c  eMapPage(pPager,
36ae0 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70   pgno, pData, &p
36af0 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pg);.      }else
36b00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
36b10 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
36b20 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
36b30 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
36b40 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
36b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
36b60 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20   pPg ){.        
36b70 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
36b80 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
36b90 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
36ba0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
36bb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
36bc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
36bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36be0 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
36bf0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
36c00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
36c10 20 72 65 74 75 72 6e 20 67 65 74 50 61 67 65 4e   return getPageN
36c20 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20 70 67  ormal(pPager, pg
36c30 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
36c40 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  s);.}.#endif /* 
36c50 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
36c60 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20 54 68  SIZE>0 */../* Th
36c70 65 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65  e page getter me
36c80 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20 74 68  thod for when th
36c90 65 20 70 61 67 65 72 20 69 73 20 61 6e 20 65 72  e pager is an er
36ca0 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73 74 61  ror state */.sta
36cb0 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65 45  tic int getPageE
36cc0 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20 2a 70  rror(.  Pager *p
36cd0 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
36ce0 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
36cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36d00 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
36d10 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
36d20 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
36d30 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
36d40 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
36d50 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
36d60 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
36d70 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
36d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
36d90 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
36da0 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
36db0 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f 29 3b  PARAMETER(pgno);
36dc0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
36dd0 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20 61 73  TER(flags);.  as
36de0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
36df0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
36e00 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
36e10 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
36e20 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a  er->errCode;.}..
36e30 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61 6c 6c  ./* Dispatch all
36e40 20 70 61 67 65 20 66 65 74 63 68 20 72 65 71 75   page fetch requ
36e50 65 73 74 73 20 74 6f 20 74 68 65 20 61 70 70 72  ests to the appr
36e60 6f 70 72 69 61 74 65 20 67 65 74 74 65 72 20 6d  opriate getter m
36e70 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ethod..*/.int sq
36e80 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20  lite3PagerGet(. 
36e90 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
36ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
36eb0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
36ec0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
36ed0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
36ee0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
36ef0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
36f00 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
36f10 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
36f20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
36f30 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
36f40 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
36f50 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
36f60 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
36f70 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
36f80 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  >xGet(pPager, pg
36f90 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
36fa0 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  s);.}../*.** Acq
36fb0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
36fc0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
36fd0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
36fe0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
36ff0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
37000 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
37010 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
37020 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
37030 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
37040 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
37050 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
37060 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
37070 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
37080 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
37090 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
370a0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
370b0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
370c0 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
370d0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
370e0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
370f0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
37100 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
37110 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
37120 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
37130 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
37140 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
37150 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
37160 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
37170 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
37180 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
37190 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
371a0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
371b0 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
371c0 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  page *pPage;.  a
371d0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
371e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
371f0 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no!=0 );.  asser
37200 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  t( pPager->pPCac
37210 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  he!=0 );.  pPage
37220 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
37230 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
37240 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b  Cache, pgno, 0);
37250 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37260 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68  ==0 || pPager->h
37270 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
37280 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d   );.  if( pPage=
37290 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
372a0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
372b0 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
372c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
372d0 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a  , pgno, pPage);.
372e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
372f0 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
37300 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  e..**.** The sql
37310 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
37320 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
37330 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 29 20  rUnrefNotNull() 
37340 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 75  may only be.** u
37350 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77 20 74  sed if we know t
37360 68 61 74 20 74 68 65 20 70 61 67 65 20 62 65 69  hat the page bei
37370 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73 20 6e  ng released is n
37380 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  ot the last page
37390 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65 20 6c  ..** The btree l
373a0 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f 6c 64  ayer always hold
373b0 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75 6e 74  s page1 open unt
373c0 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f 20 74  il the end, so t
373d0 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f  hese first.** to
373e0 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20 62 65   routines can be
373f0 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61 73 65   used to release
37400 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65 72 20   any page other 
37410 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e 70 50  than BtShared.pP
37420 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  age1..**.** Use 
37430 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
37440 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20 72 65  fPageOne() to re
37450 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20 54 68  lease page1.  Th
37460 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74 69 6e  is latter routin
37470 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68 65 20  e.** checks the 
37480 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
37490 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
374a0 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e 75 6d  s and if the num
374b0 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20  ber of.** pages 
374c0 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69 74 20  reaches zero it 
374d0 64 72 6f 70 73 20 74 68 65 20 64 61 74 61 62 61  drops the databa
374e0 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  se lock..*/.void
374f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37500 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61 67 65  efNotNull(DbPage
37510 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54 4f 4e   *pPg){.  TESTON
37520 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61 67 65  LY( Pager *pPage
37530 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
37540 20 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   ).  assert( pPg
37550 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67  !=0 );.  if( pPg
37560 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
37570 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73 73 65  MMAP ){.    asse
37580 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 31  rt( pPg->pgno!=1
37590 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20 69 73   );  /* Page1 is
375a0 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d 61   never memory ma
375b0 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67 65  pped */.    page
375c0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
375d0 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
375e0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
375f0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
37600 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73  }.  /* Do not us
37610 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
37620 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20 6c 61  o release the la
37630 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
37640 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73 65 72  page1 */.  asser
37650 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
37660 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
37670 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b 0a 7d  >pPCache)>0 );.}
37680 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
37690 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
376a0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20  pPg){.  if( pPg 
376b0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
376c0 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b  refNotNull(pPg);
376d0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
376e0 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65  agerUnrefPageOne
376f0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
37700 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
37710 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
37720 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
37730 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  g->pgno==1 );.  
37740 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
37750 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50  ags & PGHDR_MMAP
37760 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67 65 31  )==0 ); /* Page1
37770 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79   is never memory
37780 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70 50 61   mapped */.  pPa
37790 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
377a0 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  r;.  sqlite3Page
377b0 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75  rResetLockTimeou
377c0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  t(pPager);.  sql
377d0 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
377e0 65 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55  e(pPg);.  pagerU
377f0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
37800 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
37810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
37820 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73   called at the s
37830 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77 72  tart of every wr
37840 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
37850 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61  .** There must a
37860 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
37870 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
37880 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
37890 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
378a0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
378b0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
378c0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
378d0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
378e0 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77 72  er pPager and wr
378f0 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65  ite a journal he
37900 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ader.** to the s
37910 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74  tart of it. If t
37920 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
37930 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e  savepoints, open
37940 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
37950 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69  .** as well. Thi
37960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
37970 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ly used when the
37980 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
37990 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65   being .** opene
379a0 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c  d to write a rol
379b0 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20  lback log for a 
379c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20  transaction. It 
379d0 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20  is not used .** 
379e0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68  when opening a h
379f0 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot journal file 
37a00 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
37a10 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
37a20 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c  urnal file is al
37a30 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69  ready open (as i
37a40 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c  t may be in excl
37a50 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20  usive mode),.** 
37a60 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
37a70 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20 61  on just writes a
37a80 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
37a90 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
37aa0 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  the.** already o
37ab0 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  pen file. .**.**
37ac0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
37ad0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
37ae0 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68   is opened by th
37af0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
37b00 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
37b10 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72 75  rnal bitvec stru
37b20 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
37b30 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
37b40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
37b50 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
37b60 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73  essful. Otherwis
37b70 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51  e, return .** SQ
37b80 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68  LITE_NOMEM if th
37b90 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  e attempt to all
37ba0 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a  ocate Pager.pInJ
37bb0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
37bc0 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72   .** an IO error
37bd0 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67   code if opening
37be0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
37bf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
37c00 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
37c10 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
37c20 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
37c30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
37c40 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
37c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c60 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
37c70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
37c80 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
37c90 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20   pPager->pVfs;  
37ca0 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
37cb0 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a  of vfs pointer *
37cc0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
37cd0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
37ce0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37cf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
37d00 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37d10 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
37d20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
37d30 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
37d40 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64   .  /* If alread
37d50 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  y in the error s
37d60 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
37d70 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
37d80 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65   But on.  ** the
37d90 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69   other hand, thi
37da0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
37db0 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20  er called if we 
37dc0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20  are already in. 
37dd0 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61   ** an error sta
37de0 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  te. */.  if( NEV
37df0 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  ER(pPager->errCo
37e00 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50 61  de) ) return pPa
37e10 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20  ger->errCode;.. 
37e20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
37e30 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
37e40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
37e50 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
37e60 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70  ODE_OFF ){.    p
37e70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37e80 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  l = sqlite3Bitve
37e90 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e  cCreate(pPager->
37ea0 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  dbSize);.    if(
37eb0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37ec0 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nal==0 ){.      
37ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
37ee0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
37ef0 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74    .    /* Open t
37f00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37f10 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
37f20 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
37f30 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
37f40 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
37f50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
37f60 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
37f70 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
37f80 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  EMORY ){.       
37f90 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
37fa0 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  alOpen(pPager->j
37fb0 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  fd);.      }else
37fc0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  {.        int fl
37fd0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
37fe0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
37ff0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
38000 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69          int nSpi
38010 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ll;..        if(
38020 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
38030 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  e ){.          f
38040 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
38050 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
38060 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
38070 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  EMP_JOURNAL);.  
38080 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d          nSpill =
38090 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
380a0 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20  StmtSpill;.     
380b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
380c0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
380d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
380e0 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
380f0 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75   nSpill = jrnlBu
38100 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
38110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
38120 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f        .        /
38130 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
38140 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c  e database still
38150 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
38160 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65  me as it did whe
38170 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  n.        ** it 
38180 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  was originally o
38190 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  pened. */.      
381a0 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49    rc = databaseI
381b0 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
381c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
381d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
381e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
381f0 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
38200 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   (.             
38210 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
38220 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
38230 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70  >jfd, flags, nSp
38240 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ill.          );
38250 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38260 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
38270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
38280 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
38290 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
382a0 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
382b0 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
382c0 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
382d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
382e0 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
382f0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
38300 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
38310 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
38320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38330 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
38340 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
38350 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
38360 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
38370 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
38380 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
38390 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
383a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
383b0 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
383c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
383d0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
383e0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
383f0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
38400 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
38410 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
38420 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
38430 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
38440 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
38450 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
38460 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
38470 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
38480 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
38490 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
384a0 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
384b0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
384c0 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
384d0 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
384e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
384f0 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
38500 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
38510 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
38520 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
38530 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
38540 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
38550 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
38560 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
38570 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
38580 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
38590 6e 74 20 69 73 20 30 2c 20 74 68 65 6e 20 61 63  nt is 0, then ac
385a0 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
385b0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
385c0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
385d0 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
385e0 67 20 69 73 20 3e 30 2c 20 74 68 65 6e 20 61 63  g is >0, then ac
385f0 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
38600 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
38610 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
38620 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
38630 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
38640 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
38650 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
38660 0a 2a 2a 20 49 66 20 28 65 78 46 6c 61 67 3c 30  .** If (exFlag<0
38670 29 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  ) and the databa
38680 73 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f 64  se is in WAL mod
38690 65 2c 20 64 6f 20 6e 6f 74 20 74 61 6b 65 20 61  e, do not take a
386a0 6e 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 20 54 68 65  ny locks..** The
386b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
386c0 6c 20 72 75 6e 20 69 6e 20 43 4f 4e 43 55 52 52  l run in CONCURR
386d0 45 4e 54 20 6d 6f 64 65 20 69 6e 73 74 65 61 64  ENT mode instead
386e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
386f0 75 62 6a 49 6e