/ Hex Artifact Content
Login

Artifact f4e9ac39fbb1e0fde97af85c0f4e00eb90764b67:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53 68 61  .  u8 hasHeldSha
7920: 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20 20 2f  redLock;       /
7930: 2a 20 54 72 75 65 20 69 66 20 61 20 73 68 61 72  * True if a shar
7940: 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76 65 72  ed lock has ever
7950: 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a 20 20   been held */.  
7960: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
7970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7980: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7990: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
79a0: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
79b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
79c0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
79d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
79e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
79f0: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7a10: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a30: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69  e */.  Pgno dbHi
7a40: 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
7a50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73     /* Value pass
7a60: 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45  ed to FCNTL_SIZE
7a70: 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20  _HINT call */.  
7a80: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7aa0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
7ab0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
7ac0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
7af0: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
7b00: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
7b10: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
7b20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7b30: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
7b40: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
7b50: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
7b60: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
7b90: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
7ba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7bb0: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
7bc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
7bd0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
7be0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
7bf0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
7c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
7c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
7c20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c30: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
7c40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
7c50: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
7c60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7c70: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
7c80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
7c90: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
7ca0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
7cb0: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
7cc0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
7cd0: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
7ce0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
7cf0: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
7d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7d10: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7d20: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
7d30: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
7d40: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
7d50: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
7d60: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
7d70: 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20  *pBackup;    /* 
7d80: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20  Pointer to list 
7d90: 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75  of ongoing backu
7da0: 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20  p processes */. 
7db0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
7dc0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
7dd0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
7de0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
7df0: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
7e20: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
7e30: 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61  ] */.  u32 iData
7e40: 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Version;        
7e50: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
7e60: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
7e70: 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20  content changes 
7e80: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
7e90: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
7ea0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
7eb0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
7ec0: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  le changes */.. 
7ed0: 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20   int nMmapOut;  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ef0: 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70  Number of mmap p
7f00: 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  ages currently o
7f10: 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20  utstanding */.  
7f20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
7f30: 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44  Mmap;       /* D
7f40: 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d  esired maximum m
7f50: 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67  map size */.  Pg
7f60: 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69  Hdr *pMmapFreeli
7f70: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st;       /* Lis
7f80: 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70  t of free mmap p
7f90: 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69  age headers (pDi
7fa0: 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a  rty) */.  /*.  *
7fb0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75  * End of the rou
7fc0: 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20  tinely-changing 
7fd0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20  class members.  
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20  ***********/..  
8030: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8050: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
8060: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
8070: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
8080: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80a0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
80b0: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
80c0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
80d0: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
80e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
80f0: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
8100: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
8110: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8130: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
8140: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
8150: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ck */.  int page
8160: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
8170: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8180: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
8190: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
81a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
81b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
81c0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
81d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
81e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
81f0: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
8200: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
8210: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
8220: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
8230: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
8240: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8250: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8260: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
8270: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
8280: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8290: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
82a0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
82b0: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
82c0: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
82d0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
82e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
82f0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
8300: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
8310: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
8320: 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  ndler */.  int a
8330: 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20  Stat[3];        
8340: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
8350: 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  cache hits, miss
8360: 65 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f  es and writes */
8370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8380: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
83b0: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
83c0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
83d0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
83e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
83f0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
8400: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
8410: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
8420: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
8430: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
8440: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
8450: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
8460: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
8470: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8480: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
8490: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
84a0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
84b0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
84c0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
84d0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
84e0: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
84f0: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
8500: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
8510: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
8520: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
8530: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
8540: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
8550: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
8560: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
8570: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
8580: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
8590: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
85a0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
85b0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
85c0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
85d0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
85e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
85f0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
8600: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
8610: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
8620: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
8630: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
8640: 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72  e=wal" */.  char
8650: 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *zWal;         
8660: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
8670: 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61  name for write-a
8680: 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64  head log */.#end
8690: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  if.};../*.** Ind
86a0: 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74  exes for use wit
86b0: 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e  h Pager.aStat[].
86c0: 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74   The Pager.aStat
86d0: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
86e0: 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20  s.** the values 
86f0: 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73  accessed by pass
8700: 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41  ing SQLITE_DBSTA
8710: 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43  TUS_CACHE_HIT, C
8720: 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72  ACHE_MISS .** or
8730: 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20   CACHE_WRITE to 
8740: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
8750: 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  s()..*/.#define 
8760: 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20  PAGER_STAT_HIT  
8770: 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   0.#define PAGER
8780: 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64  _STAT_MISS  1.#d
8790: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
87a0: 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20  _WRITE 2../*.** 
87b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
87c0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68  obal variables h
87d0: 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65  old counters use
87e0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
87f0: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
8800: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
8810: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e   do not exist in
8820: 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e  .** a non-testin
8830: 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20  g build.  These 
8840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f  variables are no
8850: 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a  t thread-safe..*
8860: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8870: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
8880: 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
8890: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
88a0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
88b0: 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42  ges read from DB
88c0: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
88d0: 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
88e0: 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  unt = 0;   /* Nu
88f0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8900: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42  es written to DB
8910: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
8920: 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
8930: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8940: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
8950: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
8960: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
8970: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
8980: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
8990: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
89a0: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
89b0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
89c0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
89d0: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
89e0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
89f0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
8a00: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
8a10: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
8a20: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
8a30: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
8a40: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
8a50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8a60: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
8a70: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
8a80: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8a90: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
8aa0: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
8ab0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
8ac0: 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  ng.** written, s
8ad0: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
8ae0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
8af0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
8b00: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
8b10: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
8b20: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
8b30: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
8b40: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
8b50: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
8b60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
8b70: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
8b80: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
8b90: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
8ba0: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
8bb0: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
8bc0: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
8bd0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
8be0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
8bf0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
8c00: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8c10: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
8c20: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8c30: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
8c40: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
8c50: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
8c60: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
8c70: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
8c80: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
8c90: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
8ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
8cb0: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
8cc0: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
8cd0: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
8ce0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
8cf0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
8d00: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
8d10: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
8d20: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
8d30: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
8d40: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
8d50: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
8d60: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
8d70: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
8d80: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
8d90: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
8da0: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
8db0: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
8dc0: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
8dd0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
8de0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
8df0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
8e00: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
8e10: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
8e20: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
8e30: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
8e40: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
8e50: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
8e60: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
8e70: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
8e80: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
8e90: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
8ea0: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
8eb0: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
8ec0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
8ed0: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
8ee0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
8ef0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
8f00: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
8f10: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
8f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
8f30: 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70  of the of each p
8f40: 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68  age record in th
8f50: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76  e journal is giv
8f60: 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c  en by.** the fol
8f70: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f  lowing macro..*/
8f80: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8f90: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
8fa0: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
8fb0: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
8fc0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
8fd0: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
8fe0: 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20   pager. This is 
8ff0: 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65  usually the same
9000: 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73   .** size as a s
9010: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
9020: 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53  r. See also setS
9030: 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a  ectorSize()..*/.
9040: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
9050: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
9060: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
9070: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
9080: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
9090: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
90a0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
90b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
90c0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
90d0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
90e0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
90f0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
9100: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
9110: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
9120: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
9130: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
9140: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
9150: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
9160: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
9170: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
9180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9190: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
91a0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
91b0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
91c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
91d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  dif../*.** The m
91e0: 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73  acro USEFETCH is
91f0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9200: 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74  allowed to use t
9210: 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55  he xFetch and xU
9220: 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66  nfetch.** interf
9230: 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  aces to access t
9240: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
9250: 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20  g memory-mapped 
9260: 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  I/O..*/.#if SQLI
9270: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
9280: 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46  >0.# define USEF
9290: 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55  ETCH(x) ((x)->bU
92a0: 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23  seFetch).#else.#
92b0: 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48   define USEFETCH
92c0: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
92d0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
92e0: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
92f0: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
9300: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
9310: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
9320: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  83647../*.** The
9330: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
9340: 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c  s macro is a fil
9350: 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79  e descriptor (ty
9360: 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  pe sqlite3_file*
9370: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  )..** Return 0 i
9380: 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  f it is not open
9390: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62  , or non-zero (b
93a0: 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20  ut not 1) if it 
93b0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  is..**.** This i
93c0: 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73  s so that expres
93d0: 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69  sions can be wri
93e0: 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
93f0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
9400: 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a  er->jfd) ){ ....
9410: 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  **.** instead of
9420: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61  .**.**   if( pPa
9430: 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
9440: 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65  ds ){ ....*/.#de
9450: 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29  fine isOpen(pFd)
9460: 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64   ((pFd)->pMethod
9470: 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s!=0)../*.** Ret
9480: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
9490: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
94a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
94b0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
94c0: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
94d0: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
94e0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
94f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9500: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
9510: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
9520: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
9530: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
9540: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
9550: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9560: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
9570: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
9580: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9590: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
95a0: 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66  v,w,x,y) 0.# def
95b0: 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  ine pagerOpenWal
95c0: 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c  IfPresent(z) SQL
95d0: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
95e0: 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
95f0: 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c  ansaction(z) SQL
9600: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
9610: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
9620: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
9630: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
9640: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
9650: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
9660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
9670: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
9680: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
9690: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
96a0: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
96b0: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
96c0: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
96d0: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
96e0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
96f0: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
9700: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
9710: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
9720: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
9730: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
9740: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
9750: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9760: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
9770: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9780: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9790: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
97a0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97b0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
97c0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
97d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
97e0: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
97f0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9800: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9810: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
9820: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9830: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
9840: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9850: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9860: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9870: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9880: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9890: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
98a0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
98b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
98c0: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
98d0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
98e0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
98f0: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
9900: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
9910: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
9920: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
9930: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
9940: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9950: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9960: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9970: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9980: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9990: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
99a0: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
99b0: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
99c0: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
99d0: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
99e0: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
99f0: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
9a00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9a10: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
9a20: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
9a30: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9a40: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9a50: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9a60: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9a70: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a80: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9a90: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9aa0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9ab0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9ac0: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9ad0: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9ae0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9af0: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
9b00: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
9b10: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
9b20: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
9b30: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
9b40: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9b50: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9b60: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9b70: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9b80: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9b90: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9ba0: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9bb0: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9bc0: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9bd0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9be0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
9bf0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
9c00: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
9c10: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
9c20: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
9c30: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
9c40: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9c50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9c60: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9c70: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9c80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9c90: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9ca0: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
9cc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9cd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9ce0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
9cf0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9d00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9d10: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
9d20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
9d30: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
9d40: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
9d50: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
9d60: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
9d70: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
9d80: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
9d90: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
9da0: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
9db0: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
9dc0: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
9dd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
9de0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
9df0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9e00: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
9e10: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
9e20: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
9e30: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
9e40: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
9e50: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
9e60: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
9e70: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
9e80: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9e90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ea0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9eb0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9ed0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
9ee0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
9ef0: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
9f00: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
9f10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9f20: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
9f30: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
9f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9f50: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9f70: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
9f80: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9f90: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9fa0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9fc0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9fd0: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
9fe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9ff0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a000: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a010: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a030: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
a040: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
a050: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a060: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a070: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a080: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a090: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
a0a0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
a0b0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a0c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0d0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a0e0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a100: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a110: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a120: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
a140: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
a150: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a160: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a170: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
a180: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a190: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a1a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a1c0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a1d0: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a1e0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a1f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
a200: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
a210: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
a220: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
a230: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
a240: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
a250: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
a260: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
a270: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
a280: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
a290: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
a2a0: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
a2b0: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
a2c0: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
a2d0: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
a2e0: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
a2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
a300: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a310: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a330: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a340: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a350: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a360: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a370: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a380: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a390: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3a0: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a3b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
a3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3d0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a3e0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a3f0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a400: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a410: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a420: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a440: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a450: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
a460: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a470: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a480: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a490: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4a0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a4c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a4d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a4e0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
a4f0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a510: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a520: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a530: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a540: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a550: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a560: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a570: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a580: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a5a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a5b0: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a5c0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a5d0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5e0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a5f0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a600: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a610: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a620: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a630: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a640: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a650: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a670: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a680: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a6a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a6b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a6c0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a6d0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a6e0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a6f0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a700: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a710: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a720: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a730: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a740: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a750: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a760: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a770: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a780: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a790: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a7a0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a7b0: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a7c0: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a7d0: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a7e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a800: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a810: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a820: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a830: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a840: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a850: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a860: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a870: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a880: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a890: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a8a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a8b0: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a8c0: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a8d0: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a8e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a8f0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a900: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a910: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a920: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a930: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a940: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
a950: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
a960: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
a970: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
a980: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
a990: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
a9a0: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
a9b0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
a9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a9d0: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
a9e0: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
a9f0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
aa00: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
aa10: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
aa20: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
aa30: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
aa40: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
aa50: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
aa60: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
aa70: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
aa80: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
aa90: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
aaa0: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
aab0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
aac0: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
aad0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
aae0: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
aaf0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
ab00: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
ab10: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
ab20: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
ab30: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
ab40: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
ab50: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
ab60: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
ab70: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
ab80: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
ab90: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
aba0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
abc0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
abd0: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
abe0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
abf0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
ac00: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
ac10: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ac20: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
ac30: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
ac40: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
ac50: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ac60: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
ac70: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
ac80: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
ac90: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
aca0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
acb0: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
acc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acd0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ace0: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
acf0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
ad00: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ad10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
ad20: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
ad30: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
ad40: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
ad50: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
ad60: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
ad70: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
ad80: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
ad90: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
ada0: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
adb0: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
adc0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
add0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
ade0: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
adf0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
ae00: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
ae10: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
ae20: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
ae30: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
ae40: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
ae50: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
ae60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
ae70: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
ae80: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
ae90: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aea0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aeb0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
aec0: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
aed0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aee0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aef0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
af00: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
af10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
af30: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
af40: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
af50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
af70: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
af80: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
af90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
afa0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
afb0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
afc0: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
afd0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
afe0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aff0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b000: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b010: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b020: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b030: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b040: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b050: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b060: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b070: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b080: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b090: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b0a0: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b0b0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b0c0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b0d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b0e0: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b0f0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b100: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b110: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b120: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b130: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b140: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b150: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b160: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b170: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b180: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b190: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b1a0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b1b0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b1c0: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b1d0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b1e0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b1f0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b200: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b210: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b220: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b230: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b240: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b250: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b260: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b270: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b280: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b290: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b2a0: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b2b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b2c0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b2d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b2e0: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b2f0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b300: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b310: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b320: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b330: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b340: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b350: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b370: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b380: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b390: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b3a0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b3b0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b3c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b3d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b3e0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b3f0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b400: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b410: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b420: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b430: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b450: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b460: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b470: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b480: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b490: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b4a0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b4b0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b4c0: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b4d0: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b4e0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b4f0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b500: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b510: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b520: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b530: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b540: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b550: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b560: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b570: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b590: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b5a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b5b0: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b5c0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b5e0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b5f0: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b610: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b620: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b630: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b640: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b650: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b660: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b670: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b680: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b690: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b6a0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b6b0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b6c0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b6d0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b6e0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b6f0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b700: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b710: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b730: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b740: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b750: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b760: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b770: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b780: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b790: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b7a0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b7c0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b7d0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b7e0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b7f0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b800: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b810: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b820: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b830: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b840: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b850: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b860: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b870: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b880: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b890: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b8a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b8b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b8c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b8e0: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b8f0: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b920: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b930: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b940: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b950: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b960: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b970: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b980: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b990: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b9a0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b9b0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b9c0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b9d0: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b9e0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b9f0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
ba00: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
ba10: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
ba20: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
ba30: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
ba40: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
ba50: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
ba60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
ba70: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
ba80: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
ba90: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
baa0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
bab0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
bac0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
bad0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
bae0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
baf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
bb00: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
bb10: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
bb20: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
bb30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
bb40: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
bb50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bb60: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bb70: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bb80: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bb90: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
bba0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bbb0: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bbc0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bbd0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bbe0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bbf0: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bc00: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bc10: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bc20: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bc30: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bc40: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bc50: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bc60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bc70: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bc80: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bc90: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bca0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bcb0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bcc0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bcd0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bce0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bcf0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bd00: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd20: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bd30: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bd40: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bd50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bd60: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bd70: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bd80: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bd90: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bda0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bdb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bdc0: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bdd0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bde0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bdf0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
be00: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
be10: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
be20: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
be30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
be40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
be50: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
be60: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
be70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
be80: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
be90: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bea0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
beb0: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bec0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bed0: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bee0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bef0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bf00: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bf10: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bf20: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bf30: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bf40: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bf50: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bf60: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bf70: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bf80: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bf90: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bfa0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bfb0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bfc0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bfd0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bfe0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bff0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c000: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c010: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c020: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c030: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c040: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c050: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
c060: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
c070: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
c080: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
c090: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
c0a0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c0b0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c0c0: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c0d0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c0e0: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c0f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c100: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c110: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c120: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c130: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c140: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c150: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c160: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c170: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c180: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c190: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c1a0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c1b0: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c1d0: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c1e0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c1f0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c200: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c210: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c220: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c230: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c260: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c270: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c280: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c2a0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c2b0: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c2e0: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c2f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c300: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c310: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c320: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c330: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c340: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c350: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c360: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c370: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c380: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c390: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c3a0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c3b0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c3c0: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c3d0: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c3e0: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c3f0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c400: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c410: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c420: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c440: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c450: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c460: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c470: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c480: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c490: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c4a0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c4b0: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c4c0: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c4d0: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c4e0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c4f0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c500: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c510: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c520: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c530: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c540: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c550: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c560: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c570: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c580: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c590: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c5a0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c5b0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c5c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c5d0: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c5e0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c5f0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c600: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c610: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c620: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c630: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c640: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c650: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c660: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c670: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c680: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c690: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c6a0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c6b0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c6c0: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c6d0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c6e0: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c700: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c710: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c720: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c730: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c740: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c750: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c760: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c770: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c780: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c790: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c7a0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c7b0: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c7c0: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c7d0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c7e0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c7f0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c800: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c810: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c820: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c830: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c840: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c850: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c860: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c870: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c880: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c890: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c8a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c8b0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c8c0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c8d0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c8e0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c8f0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c900: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c910: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c920: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c930: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c940: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c950: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c960: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c970: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c980: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c990: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c9a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c9b0: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c9c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9d0: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c9e0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c9f0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
ca00: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
ca10: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
ca20: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
ca30: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
ca40: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
ca50: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
ca60: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
ca70: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
ca80: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
ca90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
caa0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cab0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cac0: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cad0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cae0: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
caf0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cb00: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cb10: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cb20: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cb30: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cb40: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cb50: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cb60: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cb70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cb80: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cb90: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cba0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cbb0: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cbc0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cbd0: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cbe0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cbf0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cc00: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cc10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cc20: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cc30: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cc40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cc50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cc60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cc70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cc80: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cc90: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cca0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ccb0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ccc0: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ccd0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cce0: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ccf0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cd00: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cd10: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cd20: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cd30: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cd40: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cd50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cd60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cd70: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cd80: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cd90: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cda0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cdb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cdc0: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cde0: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cdf0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ce00: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ce10: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
ce20: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
ce30: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
ce40: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ce50: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
ce60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ce70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ce80: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
ce90: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cea0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ceb0: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cec0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ced0: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cef0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cf00: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cf10: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cf20: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cf40: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cf50: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cf60: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cf90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cfa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cfb0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cfc0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cfd0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cfe0: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cff0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d000: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d010: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d020: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d030: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d040: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d050: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d060: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d070: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d080: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d090: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d0b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d0c0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d0d0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d0e0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d100: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d110: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d120: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d130: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d140: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d150: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d160: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d170: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d180: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d190: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d1a0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d1b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d1c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d1d0: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d1e0: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d1f0: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d200: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d210: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d220: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d230: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d240: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d250: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d260: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d270: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d280: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d290: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d2a0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d2b0: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d2c0: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d2e0: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d2f0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d300: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d310: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d320: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d330: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d340: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d370: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d380: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d390: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d3a0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d3b0: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d3d0: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d3e0: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d3f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d400: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d410: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d420: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d430: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d440: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d450: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d4d0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d4e0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d4f0: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d500: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d510: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d520: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d530: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d540: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d550: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d560: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d570: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d580: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d590: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d5a0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d5b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d5c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d5d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d5e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d5f0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d600: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d610: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d620: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d630: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d640: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d670: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d690: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d6a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d6b0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d6c0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d6d0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d6e0: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d6f0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d700: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d710: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d720: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d730: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d740: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d750: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d760: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d770: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d780: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d790: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d7a0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d7b0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d7c0: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d7d0: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d7e0: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d7f0: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d800: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d820: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d830: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d840: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d850: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d860: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d870: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d880: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d890: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d8a0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d8b0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d8c0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d8d0: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d8e0: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d8f0: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d900: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d910: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d920: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d930: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d940: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d950: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d960: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d970: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d980: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d990: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d9a0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d9b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d9c0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d9d0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d9e0: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d9f0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
da00: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
da10: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
da20: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
da30: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
da40: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
da50: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
da60: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
da70: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
da80: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
dab0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
dac0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
dad0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
dae0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
daf0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
db00: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
db20: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
db30: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
db40: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
db50: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
db60: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
db70: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
db80: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
db90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dba0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dbb0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dbc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dbd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dbe0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dbf0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dc00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dc10: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dc20: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dc30: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dc40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dc50: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dc60: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dc70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dc80: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dc90: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dca0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dcb0: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dcc0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dcd0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dce0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dcf0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dd00: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dd10: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dd20: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dd30: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dd40: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dd50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dd60: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dd70: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dd80: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dd90: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dda0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
ddb0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
ddc0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
ddd0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dde0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
ddf0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
de00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
de10: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
de20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
de30: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
de40: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
de50: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
de60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
de70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
de80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
de90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
dea0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
deb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dec0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
ded0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
dee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
def0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
df00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
df10: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
df20: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
df30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
df40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
df50: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
df60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
df70: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
df80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
df90: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
dfa0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
dfb0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
dfc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
dfd0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
dfe0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
dff0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e000: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e010: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e020: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e030: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e040: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e050: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e060: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e070: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e080: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e090: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e0a0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e0b0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e0c0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e0d0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e0e0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e0f0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e100: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e110: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e120: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e130: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e140: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e150: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e160: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e170: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e180: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e190: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e1c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e1d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e1e0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e1f0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e200: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e210: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e220: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e230: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e240: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e250: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e260: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e290: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e2a0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e2b0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e2e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e2f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e300: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e310: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e320: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e330: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e340: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e350: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e360: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e370: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e380: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e390: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e3a0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e3b0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e3c0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e3d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e3e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e3f0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e400: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e410: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e420: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e430: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e440: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e450: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e460: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e470: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e480: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e490: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e4a0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e4b0: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e4c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e4e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e4f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e500: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e510: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e520: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e530: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e540: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e550: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e560: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e570: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e580: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e590: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e5a0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e5b0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e5c0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e5d0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e5e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e5f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e600: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e610: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e620: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e630: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e640: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e650: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e660: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e670: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e680: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e690: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e6a0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e6b0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e6c0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e6d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e6e0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e6f0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e700: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e710: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e720: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e730: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e740: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e750: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e760: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e770: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e780: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e790: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e7a0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e7b0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e7c0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e7d0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e7e0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e7f0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e800: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e810: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e820: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e830: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e840: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e850: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e860: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e870: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e880: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e890: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e8a0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e8b0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e8c0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e8d0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e8e0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e8f0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e900: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e910: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e920: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e930: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e940: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e950: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e960: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e970: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e980: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e990: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e9a0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e9b0: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e9c0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e9d0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e9e0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e9f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
ea00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ea10: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
ea20: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ea30: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ea40: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
ea50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
ea60: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
ea70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea80: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
ea90: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eaa0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
eab0: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
eac0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ead0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
eae0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
eaf0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
eb00: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb10: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb20: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
eb30: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
eb40: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eb50: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eb60: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eb70: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eb80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eb90: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eba0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ebb0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ebc0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ebd0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ebe0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ebf0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ec00: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ec10: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ec20: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ec30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ec40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ec50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ec60: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ec70: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ec80: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ec90: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
eca0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ecb0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ecc0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ecd0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ece0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ecf0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ed00: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ed10: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ed20: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ed30: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ed40: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ed50: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ed60: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ed70: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ed80: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ed90: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
eda0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
edb0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
edc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
edd0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ede0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
edf0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ee00: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ee10: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ee20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ee30: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ee40: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ee50: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ee60: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ee70: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ee80: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ee90: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
eea0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
eeb0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
eec0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
eed0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
eee0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
eef0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ef00: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ef10: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ef20: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ef30: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ef40: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
ef50: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
ef60: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
ef70: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
ef80: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
ef90: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
efa0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
efb0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
efc0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
efd0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
efe0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
eff0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f000: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f010: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f020: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f030: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f040: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f050: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f060: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f070: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f080: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f090: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f0a0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f0b0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f0c0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f0d0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f0e0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f0f0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f100: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f110: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f120: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f130: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f140: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f150: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f160: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f170: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f180: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f190: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f1a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f1b0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f1c0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f1d0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f1e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f1f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f200: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f210: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f220: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f230: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f240: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f250: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f260: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f270: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f280: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f290: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f2a0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f2b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f2c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f2d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f2e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f2f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f300: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f310: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f320: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f330: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f340: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f350: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f360: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f370: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f390: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f3a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3b0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f3c0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f3d0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f3e0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f3f0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f410: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f420: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f430: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f440: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f460: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f470: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f480: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f490: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f4a0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f4b0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f4c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f4d0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f4e0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f4f0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f500: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f510: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f520: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f530: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f540: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f550: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f560: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f570: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f580: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f590: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f5a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f5b0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f5c0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f5d0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f5e0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f5f0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f610: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f620: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f630: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f640: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f650: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f660: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f670: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f680: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f690: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f6a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6b0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f6c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f6d0: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f6e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f6f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f700: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f710: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f720: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f740: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f750: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f760: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f770: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f7a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f7b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f7c0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f7d0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f7e0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f7f0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f810: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f820: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f830: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f840: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f850: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f860: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f870: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f880: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f890: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f8a0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f8b0: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f8c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f8d0: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f8e0: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f8f0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f900: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f910: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f920: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f930: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f940: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f950: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f960: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f970: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f980: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f990: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f9a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f9b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f9c0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f9d0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f9e0: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f9f0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fa00: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fa10: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fa20: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fa30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
fa40: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fa50: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fa60: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fa70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fa80: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fa90: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
faa0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fab0: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fac0: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fad0: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fae0: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
faf0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fb00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fb10: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fb20: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fb30: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fb40: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fb50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fb70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fb80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fb90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fbb0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fbc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fbd0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fbe0: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fbf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fc00: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fc10: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fc20: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fc30: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fc40: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fc50: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fc60: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fc70: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fc80: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fc90: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fca0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fcb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fcc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fcd0: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fce0: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fcf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fd20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fd30: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fd40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fd70: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fd80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fd90: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fda0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fdb0: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fdc0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fdd0: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fde0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fdf0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fe00: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fe10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fe20: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fe30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fe40: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fe50: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fe60: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fe70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fe80: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fe90: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fea0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
feb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fec0: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fed0: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fee0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fef0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff00: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ff10: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
ff20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
ff30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
ff40: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
ff50: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
ff60: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
ff70: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
ff80: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
ff90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
ffa0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ffb0: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ffc0: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ffd0: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ffe0: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
fff0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10000 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10010 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10020 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
10030 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
10040 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10060 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10070 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10080 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10090 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
100a0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
100b0 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
100c0 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
100d0 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
100e0 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
100f0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10100 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10110 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10120 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10130 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10140 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10150 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10160 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10170 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10180 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10190 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
101a0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
101b0 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
101c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
101d0 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
101e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
101f0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10200 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10210 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10220 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10230 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10240 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10250 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10260 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10270 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10280 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10290 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
102a0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
102b0 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
102c0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
102d0 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
102e0 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
102f0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10300 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10310 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10320 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10340 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10350 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10360 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10370 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10380 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10390 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
103a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
103b0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
103c0 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
103d0 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
103e0 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
103f0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10400 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10410 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10420 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10440 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10450 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10460 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10480 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10490 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
104a0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
104b0 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
104c0 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
104d0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
104e0 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
104f0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10500 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10510 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10520 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10530 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10540 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10550 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10560 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10570 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10580 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10590 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
105a0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
105b0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
105c0 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
105d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
105e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
105f0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10600 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10610 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10620 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10630 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10640 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10650 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10660 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10670 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10680 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10690 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
106a0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
106b0 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
106c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
106d0 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
106e0 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
106f0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10700 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10710 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10720 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10730 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10740 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10750 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10760 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10770 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10780 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10790 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
107a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
107b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
107c0 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
107d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
107e0 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
107f0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10800 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10810 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10820 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10830 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10840 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10850 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10860 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10870 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10880 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10890 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
108a0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
108b0 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
108c0 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
108d0 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
108e0 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
108f0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10900 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10910 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10920 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10930 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10940 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10950 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10960 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10970 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10980 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10990 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
109a0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
109b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
109c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
109d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10a00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10a10 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10a30 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10a40 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10a50 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10a80 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10a90 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10aa0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10ac0 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10ad0 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10ae0 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10b10 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10b20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10b30 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10b40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10b50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10b60 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10b70 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10b90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10ba0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10bb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10bc0 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10be0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10bf0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10c10 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10c20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10c30 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10c40 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10c50 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10c60 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10c70 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10c80 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10c90 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10ca0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10cb0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10cc0 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10cd0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10ce0 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10cf0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10d00 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10d10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10d20 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10d30 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10d40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10d50 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10d60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10d70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10d80 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10d90 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10da0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10db0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10dc0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10de0 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10df0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10e00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10e10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10e20 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10e30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10e40 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10e50 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10e60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10e70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10e80 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10e90 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10ea0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10eb0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10ec0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10ed0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10ef0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10f00 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10f10 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10f20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10f30 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10f40 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10f50 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10f60 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10f70 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10f80 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10f90 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10fa0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10fb0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10fd0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10fe0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
11020 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
11030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11040 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11050 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11060 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11070 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11080 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11090 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
110a0 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
110b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
110c0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
110d0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
110e0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
110f0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11100 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11110 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11120 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11130 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11140 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11150 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11160 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11170 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11180 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11190 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
111a0 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
111b0 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
111c0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
111d0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
111e0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
111f0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11200 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11210 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11220 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11230 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11240 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11250 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11260 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11270 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11280 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11290 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
112a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112b0 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
112c0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
112d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
112e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112f0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11300 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11310 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11320 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11330 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11340 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11350 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11360 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11370 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11380 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11390 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
113a0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
113b0 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
113c0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
113d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
113e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
113f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11400 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11410 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11420 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11430 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
11440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11450 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11460 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11470 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11490 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
114a0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
114b0 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
114c0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
114d0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
114e0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
114f0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11500 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11510 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11520 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11530 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11540 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11550 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11560 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11570 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11580 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11590 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
115a0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
115b0 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
115c0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
115d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
115e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
115f0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11600 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11610 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11620 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11630 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11640 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11650 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11660 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11670 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11680 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11690 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
116a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
116b0 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
116c0 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
116d0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
116e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
116f0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11700 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11710 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11720 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11730 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11740 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11750 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11760 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11770 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11780 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11790 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
117a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
117b0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
117c0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
117d0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
117e0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
117f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11800 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
11810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11820 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11830 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11850 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11860 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11870 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11880 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11890 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
118a0 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
118b0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
118c0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
118d0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
118e0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
118f0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11900 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
11910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11920 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11930 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11950 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11960 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11980 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11990 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
119a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
119b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
119c0 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
119d0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
119e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
119f0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11a00 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
11a10 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11a20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11a30 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11a40 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11a60 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11a70 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11a80 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11a90 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11aa0 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11ab0 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11ac0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11ad0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11af0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11b00 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
11b10 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11b20 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11b30 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11b40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11b50 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11b60 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11b70 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11b80 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11b90 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11ba0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11bb0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11bc0 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11bd0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11be0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11bf0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11c00 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11c10 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11c20 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11c30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11c40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11c50 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11c60 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11c70 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11c80 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11c90 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11cb0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11cc0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11cd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11ce0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11cf0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11d00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d10 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11d20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11d30 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11d40 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11d50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11d60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11d70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11d80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11d90 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11da0 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11db0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11dc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11dd0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11de0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11df0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11e00 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11e10 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11e30 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11e40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11e50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11e60 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11e70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11e90 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11ea0 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11eb0 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11ec0 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11ed0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11ee0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11ef0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11f00 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11f10 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11f20 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11f30 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11f40 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11f50 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11f60 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11f70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11f80 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11f90 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11fa0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11fb0 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11fc0 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11fd0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11fe0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11ff0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
12000 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12010 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
12020 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12040 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12050 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
12060 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12070 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12080 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
12090 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
120a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
120b0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
120c0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
120d0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
120e0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
120f0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
12100 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12110 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
12120 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12130 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12140 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
12150 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
12160 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12170 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12180 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
121a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
121b0 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
121c0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
121d0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
121e0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
121f0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12200 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12210 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12220 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12230 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12240 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
12250 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
12260 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12270 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12280 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12290 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
122a0 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
122b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
122c0 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
122d0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
122e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
122f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12300 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12310 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12320 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12330 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12350 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12360 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12370 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12380 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12390 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
123a0 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
123b0 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
123c0 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
123d0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
123e0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
123f0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12400 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12410 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12430 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12440 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12450 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12460 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12470 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12480 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12490 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
124a0 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
124b0 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
124c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
124d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
124e0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
124f0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12500 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12510 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12520 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12530 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12540 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12550 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12560 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12570 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12580 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12590 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
125a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
125b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
125c0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
125d0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
125e0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
125f0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12600 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
12610 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12620 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12630 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12640 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12650 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
12660 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
12670 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
12680 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
12690 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
126a0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
126b0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
126c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
126d0 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
126e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12700 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12710 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12720 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12730 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12740 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
12750 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
12760 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12770 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
12780 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
12790 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
127a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
127b0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
127c0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
127d0 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
127e0 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
127f0 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
12800 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12810 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12820 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12830 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12840 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
12850 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
12860 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12870 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
12880 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
12890 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
128a0 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
128b0 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
128c0 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
128d0 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
128e0 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
128f0 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
12900 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12910 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12920 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12930 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12940 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
12950 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
12960 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
12970 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
12980 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
12990 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
129a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
129b0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
129c0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
129d0 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
129e0 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
129f0 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
12a00 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12a10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12a20 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12a30 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12a40 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12a50 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12a60 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12a70 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12a80 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12a90 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12aa0 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
12ab0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
12ac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12ad0 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
12ae0 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
12af0 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
12b00 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12b10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12b20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12b30 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12b40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12b50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
12b60 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
12b70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12b80 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
12b90 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
12ba0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
12bb0 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
12bc0 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
12bd0 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
12be0 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
12bf0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12c00 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
12c10 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12c20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c30 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
12c40 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12c50 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
12c60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
12c70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
12c80 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
12c90 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
12ca0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
12cb0 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
12cc0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
12cd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
12ce0 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
12cf0 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
12d00 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
12d10 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
12d20 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
12d30 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
12d40 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
12d50 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
12d60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12d70 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
12d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12d90 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
12da0 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
12db0 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
12dc0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
12dd0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
12de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12df0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
12e00 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
12e10 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
12e20 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
12e30 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
12e40 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
12e50 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
12e60 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
12e70 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
12e80 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
12e90 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
12ea0 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
12eb0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
12ec0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
12ed0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12ee0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
12ef0 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
12f00 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
12f10 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
12f20 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
12f30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12f40 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
12f50 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
12f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
12f70 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
12f80 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
12f90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
12fa0 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
12fb0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
12fc0 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
12fd0 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
12fe0 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
12ff0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
13000 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
13010 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13020 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13030 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13040 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
13050 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
13060 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
13070 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
13080 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13090 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
130a0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
130b0 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
130c0 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
130d0 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
130e0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
130f0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13100 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
13110 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13120 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13130 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13140 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
13150 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13160 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
13170 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
13180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13190 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
131a0 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
131b0 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
131c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
131d0 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
131e0 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
131f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
13200 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
13210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13220 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13230 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13240 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
13250 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
13260 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
13270 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
13280 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
13290 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
132a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
132b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132c0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
132d0 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
132e0 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
132f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13300 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
13310 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13320 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13330 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13340 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
13350 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13360 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
13370 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
13380 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13390 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
133a0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
133b0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
133c0 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
133d0 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
133e0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
133f0 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
13400 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
13410 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13420 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13430 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13440 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
13450 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13460 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13470 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
13480 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
13490 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
134a0 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
134b0 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
134c0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
134d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
134e0 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
134f0 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
13500 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
13510 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13520 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13530 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13540 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13550 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
13560 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
13570 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
13580 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
13590 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
135a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
135b0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
135c0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
135d0 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
135e0 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
135f0 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13600 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13610 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13620 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13630 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13640 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
13650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13660 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
13670 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
13680 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
13690 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
136a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
136b0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
136c0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
136d0 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
136e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
136f0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13700 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13710 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13720 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13730 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13740 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
13750 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
13760 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
13770 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
13780 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
13790 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
137a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
137b0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
137c0 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
137d0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
137e0 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
137f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13800 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13810 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13820 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13830 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13840 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
13850 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
13860 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
13870 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
13880 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
13890 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
138a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
138b0 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
138c0 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
138d0 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
138e0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
138f0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13900 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13910 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13920 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13930 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13940 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
13950 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
13960 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
13970 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13980 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
13990 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
139a0 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
139b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
139c0 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
139d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
139e0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
139f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13a00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13a20 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13a30 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13a40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13a50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13a60 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13a70 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13a80 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13aa0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13ab0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13ac0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13ad0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13ae0 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13af0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13b00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13b10 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
13b20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
13b30 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
13b40 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13b50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
13b60 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13b70 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
13b80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13b90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13bb0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13bc0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
13bd0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13be0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13c10 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13c20 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
13c30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13c40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
13c50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
13c90 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13ca0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
13cb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13cc0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
13cd0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
13ce0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13cf0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
13d00 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
13d10 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
13d20 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
13d30 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
13d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13d50 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
13d60 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
13d70 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
13d80 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
13d90 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
13da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
13db0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
13dc0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
13dd0 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
13de0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
13df0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
13e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13e10 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13e20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13e30 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
13e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13e50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13e60 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13e90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13ea0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
13eb0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
13ec0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
13ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13ee0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
13ef0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
13f00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
13f10 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
13f20 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
13f30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13f40 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13f60 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
13f70 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
13f80 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
13f90 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
13fa0 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
13fb0 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
13fc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
13fd0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
13fe0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
13ff0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
14000 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
14010 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
14020 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
14030 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
14040 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
14050 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
14060 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
14070 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  nal. .      */. 
14080 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14090 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d   = (!pPager->tem
140a0 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  pFile && sqlite3
140b0 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50  JournalExists(pP
140c0 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20  ager->jfd));.   
140d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
140e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
140f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14100 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
14110 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14120 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14130 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14140 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14150 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14160 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14170 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14180 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14190 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
141a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
141b0 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
141c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
141d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
141e0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
141f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
14200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14210 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14220 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14230 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
14240 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14250 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14260 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14270 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14280 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14290 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
142a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
142b0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
142c0 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50  dr *p = sqlite3P
142d0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
142e0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
142f0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
14300 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
14310 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
14320 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20  efNotNull(p);.  
14330 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14340 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
14350 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
14360 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
14370 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
14380 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14390 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
143a0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
143b0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
143c0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
143d0 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
143e0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
143f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
14400 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
14410 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
14420 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
14430 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
14440 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
14450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
14460 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
14470 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14480 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
14490 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
144a0 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
144b0 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
144c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
144d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
144e0 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
144f0 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
14500 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
14510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
14520 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
14530 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
14540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
14550 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e  mmit && pPager->
14560 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65  dbFileSize>pPage
14570 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
14580 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14590 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f  is taken when co
145a0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
145b0 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61  action in rollba
145c0 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ck-journal.    *
145d0 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61  * mode if the da
145e0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
145f0 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68  isk is larger th
14600 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
14610 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74  image..    ** At
14620 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
14630 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14640 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74   finalized and t
14650 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
14660 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
14670 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62  lly committed, b
14680 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  ut the EXCLUSIVE
14690 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68   lock is still h
146a0 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  eld on the.    *
146b0 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73  * file. So it is
146c0 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74   safe to truncat
146d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
146e0 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ile to its minim
146f0 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  um.    ** requir
14700 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ed size.  */.   
14710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14720 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
14730 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  E_LOCK );.    rc
14740 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
14750 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
14760 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
14770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14780 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14790 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
147a0 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  >fd) ){.    rc =
147b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
147c0 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
147d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
147e0 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
147f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
14800 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14810 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14820 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
14830 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14840 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
14850 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14860 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
14870 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
14880 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
14890 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
148a0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
148b0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
148c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
148d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
148e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
148f0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
14900 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
14910 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
14920 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
14930 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
14940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
14950 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
14960 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14970 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
14980 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
14990 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
149a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
149b0 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
149c0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
149d0 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
149e0 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
149f0 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
14a00 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
14a10 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
14a20 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
14a30 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14a40 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
14a50 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
14a60 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
14a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14a80 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
14a90 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
14aa0 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
14ab0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
14ac0 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
14ad0 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
14ae0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
14af0 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
14b00 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
14b10 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
14b20 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
14b30 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
14b40 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
14b50 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
14b60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
14b70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
14b80 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14b90 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
14ba0 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
14bb0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14bc0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14bd0 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
14be0 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
14bf0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14c00 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14c10 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
14c20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
14c30 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14c40 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
14c50 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
14c60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14c70 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
14c80 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
14c90 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14ca0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14cb0 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
14cc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
14cd0 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
14ce0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
14cf0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
14d00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14d10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
14d20 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
14d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
14d40 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14d60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
14d70 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14d80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14d90 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
14da0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
14db0 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
14dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14dd0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
14de0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
14df0 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
14e00 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
14e10 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
14e20 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
14e30 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
14e40 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
14e50 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
14e60 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
14e70 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
14e80 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
14e90 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
14ea0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
14eb0 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
14ec0 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
14ed0 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
14ee0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
14ef0 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
14f00 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
14f10 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
14f20 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
14f30 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
14f40 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
14f50 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
14f60 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
14f70 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
14f80 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
14f90 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
14fa0 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
14fb0 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
14fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
14fd0 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
14fe0 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
14ff0 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15000 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15010 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
15020 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15030 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15040 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15050 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15060 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15070 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15080 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15090 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
150a0 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
150b0 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
150c0 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
150d0 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
150e0 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
150f0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15100 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15110 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
15120 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15130 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15140 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15150 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15160 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15170 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15180 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15190 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
151a0 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
151b0 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
151c0 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
151d0 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
151e0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
151f0 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
15200 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
15210 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
15220 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
15230 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15240 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
15250 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
15260 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15270 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
15280 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
15290 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
152a0 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
152b0 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
152c0 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
152d0 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
152e0 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
152f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
15300 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
15310 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
15320 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
15330 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
15340 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
15350 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
15360 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
15370 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15380 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15390 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
153a0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
153b0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
153c0 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
153d0 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
153e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
15410 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
15420 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
15430 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
15440 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
15450 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
15460 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
15470 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
15480 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15490 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
154a0 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
154b0 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
154c0 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
154d0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
154e0 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
154f0 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
15500 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
15510 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
15520 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
15530 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15540 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
15550 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
15560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15570 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
15580 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
15590 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
155a0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
155b0 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
155c0 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
155d0 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
155e0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
155f0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
15600 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
15610 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
15620 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
15630 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
15640 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
15650 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
15660 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
15670 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
15680 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
15690 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
156a0 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
156b0 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
156c0 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
156d0 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
156e0 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
156f0 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
15700 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
15710 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
15720 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
15730 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
15740 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
15750 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
15760 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15770 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
15780 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15790 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
157a0 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
157b0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
157c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
157d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
157e0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
157f0 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
15800 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
15810 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
15820 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15830 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
15840 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
15850 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
15860 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
15870 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
15880 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
15890 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
158a0 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
158b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
158c0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
158d0 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
158e0 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
158f0 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
15900 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
15910 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15920 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
15930 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
15940 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
15950 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
15960 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
15970 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
15980 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
15990 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
159a0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
159b0 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
159c0 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
159d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
159e0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
159f0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
15a00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
15a10 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
15a20 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15a30 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
15a40 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
15a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
15a60 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
15a70 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
15a80 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
15a90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15aa0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15ab0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
15ac0 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
15ad0 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
15ae0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
15af0 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
15b00 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
15b10 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
15b20 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
15b30 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
15b40 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
15b50 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
15b60 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
15b70 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
15b80 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
15b90 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
15ba0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
15bc0 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
15bd0 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
15be0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
15bf0 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
15c00 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
15c10 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
15c20 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
15c30 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
15c40 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
15c50 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
15c60 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
15c70 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
15c80 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
15c90 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
15ca0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
15cb0 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
15cc0 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
15cd0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
15ce0 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
15cf0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
15d00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15d10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15d20 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
15d30 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
15d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15d50 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
15d60 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
15d70 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
15d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15d90 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
15da0 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
15db0 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15dd0 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
15de0 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
15df0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
15e00 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
15e10 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
15e20 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
15e30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
15e40 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
15e50 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
15e60 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
15e70 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15e80 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
15e90 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
15ea0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
15eb0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
15ec0 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
15ed0 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
15ee0 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
15ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15f00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
15f10 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
15f20 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15f50 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
15f60 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
15f70 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
15f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15f90 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
15fa0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
15fb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
15fc0 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
15fd0 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
15fe0 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
15ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
16000 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
16030 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
16040 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
16050 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
16060 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
16070 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
16080 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16090 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
160a0 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
160b0 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
160c0 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
160d0 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
160e0 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
160f0 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
16100 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
16110 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
16120 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
16130 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
16140 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
16150 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
16160 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72    aData = pPager
16170 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
16180 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
16190 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
161a0 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
161b0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
161c0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73  llocated */.  as
161d0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
161e0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
161f0 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  (!isMainJrnl && 
16200 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20  isSavepnt) );.. 
16210 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73   /* Either the s
16220 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20  tate is greater 
16230 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45  than PAGER_WRITE
16240 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72  R_CACHEMOD (a tr
16250 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
16260 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
16270 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68  lback done at th
16280 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65  e request of the
16290 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73   caller) or this
162a0 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   is.  ** a hot-j
162b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
162c0 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d   If it is a hot-
162d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
162e0 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  , the pager.  **
162f0 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45   is in state OPE
16300 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45  N and holds an E
16310 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48  XCLUSIVE lock. H
16320 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16330 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  ack.  ** only re
16340 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ads from the mai
16350 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74  n journal, not t
16360 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
16370 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16380 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16390 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
163a0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28  EMOD.       || (
163b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
163c0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50  PAGER_OPEN && pP
163d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
163e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
163f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16400 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
16410 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
16420 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  D || isMainJrnl 
16430 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  );..  /* Read th
16440 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
16450 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
16460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
16470 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
16480 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
16490 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
164a0 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
164b0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
164c0 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
164d0 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
164e0 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
164f0 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
16500 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
16510 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
16520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16530 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16540 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16550 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
16560 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
16570 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
16580 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
16590 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
165a0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
165b0 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
165c0 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
165d0 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
165e0 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
165f0 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
16600 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
16610 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
16620 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
16630 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
16640 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
16650 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
16660 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
16670 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
16680 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
16690 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
166a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
166b0 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
166c0 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
166d0 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
166e0 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
166f0 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
16700 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
16710 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
16720 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
16730 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
16740 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
16750 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
16760 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16770 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
16780 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
16790 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
167a0 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
167b0 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
167c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
167d0 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
167e0 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
167f0 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
16800 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
16810 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
16820 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16830 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
16840 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
16850 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
16860 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
16870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16880 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
16890 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
168a0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
168b0 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
168c0 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20  k before during 
168d0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
168e0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
168f0 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20  don't bother to 
16900 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61  play it back aga
16910 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
16920 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
16930 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
16940 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
16950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16960 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16970 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
16980 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65   back page 1, re
16990 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72  store the nReser
169a0 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  ve setting.  */.
169b0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26    if( pgno==1 &&
169c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
169d0 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b  e!=((u8*)aData)[
169e0 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65  20] ){.    pPage
169f0 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28  r->nReserve = ((
16a00 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a  u8*)aData)[20];.
16a10 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16a20 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
16a30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
16a40 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d  ger is in CACHEM
16a50 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  OD state, then t
16a60 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
16a70 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
16a80 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
16a90 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
16aa0 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
16ab0 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
16ac0 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
16ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16ae0 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
16af0 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
16b00 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
16b10 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
16b20 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
16b30 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
16b40 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
16b50 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
16b60 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
16b70 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
16b80 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
16b90 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
16ba0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
16bb0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
16bc0 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
16bd0 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
16be0 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
16bf0 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
16c00 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
16c10 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
16c20 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
16c30 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
16c40 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
16c50 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
16c60 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
16c70 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
16c80 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
16c90 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42   If in WRITER_DB
16ca0 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49  MOD, WRITER_FINI
16cb0 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  SHED or OPEN sta
16cc0 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
16cd0 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  te the.  ** page
16ce0 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
16cf0 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69  ists and the mai
16d00 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
16d10 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
16d20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e  .  ** not dirty.
16d30 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65   Since this code
16d40 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65   is only execute
16d50 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  d in PAGER_OPEN 
16d60 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61  state for.  ** a
16d70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16d80 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61  lback, it is gua
16d90 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
16da0 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65   page-cache is e
16db0 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65  mpty.  ** if the
16dc0 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45   pager is in OPE
16dd0 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  N state..  **.  
16de0 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
16df0 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
16e00 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
16e10 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
16e20 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
16e30 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
16e40 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
16e50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
16e60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16e70 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
16e80 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
16e90 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
16ea0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
16eb0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
16ec0 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
16ed0 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
16ee0 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
16ef0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
16f00 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
16f10 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
16f20 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
16f30 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
16f40 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
16f50 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
16f60 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
16f70 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
16f80 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
16f90 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
16fa0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
16fb0 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
16fc0 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
16fd0 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
16fe0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
16ff0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
17000 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
17010 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
17020 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
17030 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
17040 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
17050 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
17060 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
17070 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
17080 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
17090 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
170a0 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
170b0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
170c0 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
170d0 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
170e0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
170f0 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
17100 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
17110 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
17120 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
17130 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
17140 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
17150 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
17160 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
17170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
17180 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
17190 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
171a0 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
171b0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
171c0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
171d0 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
171e0 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
171f0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
17200 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
17210 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
17220 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
17230 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
17240 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
17250 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
17260 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17270 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
17280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
17290 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
172a0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
172b0 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  o);.  }.  assert
172c0 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20  ( pPg || !MEMDB 
172d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
172e0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
172f0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d  ER_OPEN || pPg==
17300 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
17310 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
17320 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
17330 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
17340 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17350 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
17360 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
17370 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
17380 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
17390 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
173a0 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
173b0 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
173c0 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
173d0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
173e0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
173f0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
17400 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
17410 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
17420 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
17430 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
17440 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
17450 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
17460 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
17470 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
17480 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
17490 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
174a0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
174b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
174c0 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
174d0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
174e0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
174f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17500 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17510 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
17520 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
17530 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
17540 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
17550 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17560 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17570 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
17580 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17590 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
175a0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
175b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
175c0 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
175d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
175e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
175f0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
17600 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
17610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
17620 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
17630 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
17640 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
17650 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
17660 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
17670 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
17680 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
17690 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
176a0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
176b0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
176c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
176d0 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  M, aData);.    }
176e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
176f0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
17700 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
17710 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
17720 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
17730 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
17740 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
17750 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
17760 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
17770 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
17780 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
17790 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
177a0 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
177b0 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
177c0 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
177d0 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
177e0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
177f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
17800 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
17810 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
17820 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
17830 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
17840 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
17850 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
17860 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
17870 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
17880 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
17890 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
178a0 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
178b0 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
178c0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
178d0 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
178e0 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
178f0 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
17900 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
17910 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17920 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
17930 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
17940 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
17950 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
17960 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
17970 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
17980 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
17990 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
179a0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
179b0 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
179c0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
179d0 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
179e0 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
179f0 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
17a00 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
17a10 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
17a20 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
17a30 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
17a40 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
17a50 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
17a60 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
17a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
17a80 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73  avepnt );.    as
17a90 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
17aa0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
17ab0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d  LFLAG_ROLLBACK)=
17ac0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
17ad0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
17ae0 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17af0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  CK;.    rc = sql
17b00 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
17b10 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c  ger, pgno, &pPg,
17b20 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
17b30 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
17b40 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
17b50 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b  _ROLLBACK)!=0 );
17b60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
17b70 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c  otSpill &= ~SPIL
17b80 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  LFLAG_ROLLBACK;.
17b90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17ba0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17bb0 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  c;.    pPg->flag
17bc0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
17bd0 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74  _READ;.    sqlit
17be0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
17bf0 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66  y(pPg);.  }.  if
17c00 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
17c10 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
17c20 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
17c30 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
17c40 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
17c50 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
17c60 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
17c70 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
17c80 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
17c90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
17ca0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
17cb0 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
17cc0 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
17cd0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
17ce0 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
17cf0 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
17d00 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
17d10 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
17d20 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
17d30 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
17d40 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
17d50 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
17d60 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44   pData = pPg->pD
17d70 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ata;.    memcpy(
17d80 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74  pData, (u8*)aDat
17d90 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17da0 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ize);.    pPager
17db0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29  ->xReiniter(pPg)
17dc0 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e  ;.    if( isMain
17dd0 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65  Jrnl && (!isSave
17de0 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c  pnt || *pOffset<
17df0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
17e00 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hdr) ){.      /*
17e10 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   If the contents
17e20 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65   of this page we
17e30 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64  re just restored
17e40 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a   from the main .
17e50 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17e60 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20   file, then its 
17e70 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20  content must be 
17e80 61 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65  as they were whe
17e90 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  n the .      ** 
17ea0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17eb0 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e  first opened. In
17ec0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61   this case we ca
17ed0 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a  n mark the page.
17ee0 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61        ** as clea
17ef0 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  n, since there w
17f00 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74  ill be no need t
17f10 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74  o write it out t
17f20 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  o the.      ** d
17f30 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
17f40 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
17f50 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
17f60 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
17f70 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
17f80 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
17f90 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
17fa0 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
17fb0 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
17fc0 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
17fd0 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
17fe0 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
17ff0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
18000 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
18010 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
18020 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
18030 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
18040 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
18050 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
18060 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
18070 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
18080 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
18090 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
180a0 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
180b0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
180c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
180d0 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
180e0 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
180f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
18100 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
18110 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
18120 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
18130 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
18140 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
18150 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
18160 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
18170 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
18180 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
18190 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
181a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
181b0 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
181c0 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
181d0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
181e0 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
181f0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
18200 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
18210 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
18220 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
18230 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
18240 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
18250 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
18260 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
18270 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
18280 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
18290 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
182a0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
182b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
182c0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70  cacheMakeClean(p
182d0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Pg);.    }.    p
182e0 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
182f0 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  h(pPg);..    /* 
18300 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
18310 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
18320 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
18330 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
18340 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
18350 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
18360 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
18370 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
18380 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
18390 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
183a0 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
183b0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
183c0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
183d0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
183e0 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
183f0 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
18400 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
18410 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
18420 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18430 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
18440 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
18450 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
18460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18470 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
18480 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
18490 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
184a0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
184b0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
184c0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
184d0 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
184e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
184f0 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
18500 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
18510 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
18520 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
18530 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
18540 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18550 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
18560 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
18570 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
18580 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
18590 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
185a0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
185b0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
185c0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
185d0 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
185e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
185f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18600 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
18610 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
18620 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
18630 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
18640 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
18650 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
18660 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
18670 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
18680 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
18690 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
186a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
186b0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
186c0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
186d0 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
186e0 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
186f0 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
18700 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
18710 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
18720 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
18730 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
18740 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
18750 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
18760 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
18770 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
18780 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
18790 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
187a0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
187b0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
187c0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
187d0 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
187e0 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
187f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
18800 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
18810 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18820 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18830 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
18840 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
18850 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
18860 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
18870 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
18880 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
18890 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
188a0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
188b0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
188c0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
188d0 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
188e0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
188f0 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
18900 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
18910 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
18920 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
18930 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
18940 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
18950 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
18960 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
18970 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
18980 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18990 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
189a0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
189b0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
189c0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
189d0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
189e0 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
189f0 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
18a00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
18a10 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
18a20 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
18a30 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
18a40 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
18a50 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
18a60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
18a70 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
18a80 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
18a90 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
18aa0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
18ab0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
18ac0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
18ad0 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
18ae0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
18af0 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
18b00 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
18b10 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18b20 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
18b30 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
18b40 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
18b50 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
18b60 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
18b70 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18b80 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
18b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18ba0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
18bb0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
18bc0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
18bd0 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18be0 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18bf0 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18c00 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18c10 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18c20 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18c30 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18c40 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18c50 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18c60 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18c80 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
18ca0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
18cb0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
18cc0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18cd0 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18ce0 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18cf0 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18d00 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18d10 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18d20 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18d30 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18d40 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18d50 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18d60 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18d70 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
18d80 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
18d90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18da0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
18db0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
18dc0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
18dd0 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18de0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18df0 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18e00 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18e10 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18e20 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18e30 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18e40 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18e50 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18e60 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18e70 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
18e80 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
18e90 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
18ea0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
18eb0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
18ec0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
18ed0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
18ee0 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
18ef0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
18f00 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
18f10 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
18f20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
18f30 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
18f40 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
18f50 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
18f60 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18f70 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
18f80 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
18f90 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
18fa0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
18fb0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18fc0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
18fd0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
18fe0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
18ff0 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
19000 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
19010 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19020 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
19030 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
19040 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
19050 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19060 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19070 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f  er_out;..  /* Lo
19080 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
19090 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
190a0 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
190b0 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  ained from.  ** 
190c0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
190d0 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
190e0 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
190f0 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e  l.   Also obtain
19100 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  .  ** sufficient
19110 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74   space (in zMast
19120 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74  erPtr) to hold t
19130 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74  he names of mast
19140 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  er.  ** journal 
19150 66 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20  files extracted 
19160 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c  from regular rol
19170 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a  lback-journals..
19180 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
19190 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
191a0 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
191b0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
191c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
191d0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
191e0 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20  t;.  nMasterPtr 
191f0 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
19200 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a  me+1;.  zMasterJ
19210 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
19220 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f  Malloc(nMasterJo
19230 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50  urnal + nMasterP
19240 74 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21  tr + 1);.  if( !
19250 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
19260 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19270 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
19280 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19290 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
192a0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
192b0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
192c0 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
192d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
192e0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
192f0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
19300 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
19310 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19320 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
19330 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
19340 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
19350 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
19360 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
19370 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
19380 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
19390 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
193a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
193b0 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
193c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
193d0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
193e0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
193f0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
19400 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
19410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19420 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
19430 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19440 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
19450 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
19460 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
19470 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
19480 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19490 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
194a0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
194b0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
194c0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
194d0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
194e0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
194f0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
19500 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
19510 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
19520 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
19530 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
19540 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
19550 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
19560 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
19570 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  L);.      rc = s
19580 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19590 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f  s, zJournal, pJo
195a0 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29  urnal, flags, 0)
195b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
195c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
195d0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
195e0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
195f0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  ..      rc = rea
19600 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
19610 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72  Journal, zMaster
19620 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29  Ptr, nMasterPtr)
19630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
19640 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
19650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
19660 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19670 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
19680 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
19690 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73  ..      c = zMas
196a0 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
196b0 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
196c0 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
196d0 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
196e0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
196f0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
19700 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
19710 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19720 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74  . */.        got
19730 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19750 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
19760 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
19770 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
19780 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  }. .  sqlite3OsC
19790 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
197a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
197b0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
197c0 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
197d0 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ter_out:.  sqlit
197e0 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
197f0 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
19800 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Master ){.    sq
19810 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
19820 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
19830 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72  t( !isOpen(pJour
19840 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  nal) );.    sqli
19850 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72  te3_free(pMaster
19860 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19870 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
19880 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
19890 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68  sed to change th
198a0 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
198b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
198c0 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  * file in the fi
198d0 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20  le-system. This 
198e0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65  only happens whe
198f0 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  n committing a t
19900 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f  ransaction,.** o
19910 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
19920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e   transaction (in
19930 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20  cluding rolling 
19940 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
19950 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
19960 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
19970 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e  file is not open
19980 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69  , or the pager i
19990 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a  s not in either.
199a0 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e  ** DBMOD or OPEN
199b0 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
199c0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
199d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
199e0 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65   size .** of the
199f0 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64   file is changed
19a00 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
19a10 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
19a20 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
19a30 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
19a40 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
19a50 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
19a60 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
19a70 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
19a80 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
19a90 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
19aa0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
19ab0 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63  t might be the c
19ac0 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ase that the fil
19ad0 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61  e on disk is sma
19ae0 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50  ller than .** nP
19af0 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20  age pages. Some 
19b00 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
19b10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
19b20 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
19b30 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79  d if .** you try
19b40 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66   to truncate a f
19b50 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65  ile to some size
19b60 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20   that is larger 
19b70 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72  than it .** curr
19b80 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74  ently is, so det
19b90 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
19ba0 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
19bb0 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a   zero byte to .*
19bc0 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  * the end of the
19bd0 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61   new file instea
19be0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
19bf0 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53  essful, return S
19c00 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
19c10 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
19c20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a  while modifying.
19c30 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
19c40 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65  file, return the
19c50 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
19c60 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
19c70 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
19c80 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
19c90 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
19ca0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
19cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
19cc0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
19cd0 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
19ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19cf0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
19d00 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a  ER_READER );.  .
19d10 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
19d20 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20  ger->fd) .   && 
19d30 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
19d40 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
19d50 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
19d60 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
19d70 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  N) .  ){.    i64
19d80 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
19d90 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  wSize;.    int s
19da0 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
19db0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  pageSize;.    as
19dc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
19dd0 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
19de0 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f  OCK );.    /* TO
19df0 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74  DO: Is it safe t
19e00 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69  o use Pager.dbFi
19e10 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a  leSize here? */.
19e20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19e30 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
19e40 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53  r->fd, &currentS
19e50 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a  ize);.    newSiz
19e60 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29  e = szPage*(i64)
19e70 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72  nPage;.    if( r
19e80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19e90 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77  currentSize!=new
19ea0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Size ){.      if
19eb0 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65  ( currentSize>ne
19ec0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  wSize ){.       
19ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
19ee0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
19ef0 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20  fd, newSize);.  
19f00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
19f10 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67  urrentSize+szPag
19f20 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  e)<=newSize ){. 
19f30 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d         char *pTm
19f40 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  p = pPager->pTmp
19f50 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d  Space;.        m
19f60 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73  emset(pTmp, 0, s
19f70 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  zPage);.        
19f80 74 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69  testcase( (newSi
19f90 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75  ze-szPage) == cu
19fa0 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20  rrentSize );.   
19fb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
19fc0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20  newSize-szPage) 
19fd0 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29  >  currentSize )
19fe0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
19ff0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a000 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20  ager->fd, pTmp, 
1a010 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d  szPage, newSize-
1a020 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  szPage);.      }
1a030 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1a040 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a050 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
1a060 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  leSize = nPage;.
1a070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a080 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a090 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1a0a0 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69   sanitized versi
1a0b0 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  on of the sector
1a0c0 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65  -size of OS file
1a0d0 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72   pFile. The.** r
1a0e0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67  eturn value is g
1a0f0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65  uaranteed to lie
1a100 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20   between 32 and 
1a110 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1a120 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53  .*/.int sqlite3S
1a130 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
1a140 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
1a150 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c    int iRet = sql
1a160 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1a170 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69  (pFile);.  if( i
1a180 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52  Ret<32 ){.    iR
1a190 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  et = 512;.  }els
1a1a0 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53  e if( iRet>MAX_S
1a1b0 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20  ECTOR_SIZE ){.  
1a1c0 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45    assert( MAX_SE
1a1d0 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29  CTOR_SIZE>=512 )
1a1e0 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58  ;.    iRet = MAX
1a1f0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1a200 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b  }.  return iRet;
1a210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1a220 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
1a230 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
1a240 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65  variable for the
1a250 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20   given.** pager 
1a260 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c  based on the val
1a270 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
1a280 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d  he xSectorSize m
1a290 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20  ethod.** of the 
1a2a0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
1a2b0 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73  le. The sector s
1a2c0 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ize will be used
1a2d0 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e   .** to determin
1a2e0 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61  e the size and a
1a2f0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72  lignment of jour
1a300 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a  nal header and .
1a310 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1a320 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69  l pointers withi
1a330 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61  n created journa
1a340 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  l files..**.** F
1a350 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
1a360 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  es the effective
1a370 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
1a380 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1a390 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1a3a0 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f  e, for non-tempo
1a3b0 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20  rary files, the 
1a3c0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1a3d0 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20   size is.** the 
1a3e0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
1a3f0 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a  y the xSectorSiz
1a400 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64  e() method round
1a410 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a  ed up to 32 if.*
1a420 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  * it is less tha
1a430 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64  n 32, or rounded
1a440 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
1a450 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
1a460 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
1a470 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
1a480 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E..**.** If the 
1a490 66 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c  file has the SQL
1a4a0 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1a4b0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72  AFE_OVERWRITE pr
1a4c0 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74  operty, then set
1a4d0 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76  .** the effectiv
1a4e0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f  e sector size to
1a4f0 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   its minimum val
1a500 75 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70  ue (512).  The p
1a510 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61  urpose of.** pPa
1a520 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1a530 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65  is to define the
1a540 20 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20   "blast radius" 
1a550 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a  of bytes that.**
1a560 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66   might change if
1a570 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20   a crash occurs 
1a580 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
1a590 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69   a single byte i
1a5a0 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e  n.** that range.
1a5b0 20 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52    But with POWER
1a5c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20  SAFE_OVERWRITE, 
1a5d0 74 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73  the blast radius
1a5e0 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61   is zero.** (tha
1a5f0 74 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53  t is what POWERS
1a600 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65  AFE_OVERWRITE me
1a610 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69  ans), so we mini
1a620 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a  mize the sector.
1a630 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61  ** size.  For ba
1a640 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
1a650 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c  ility of the rol
1a660 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
1a670 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65  le format,.** we
1a680 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74   cannot reduce t
1a690 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63  he effective sec
1a6a0 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35  tor size below 5
1a6b0 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
1a6c0 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
1a6d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a6e0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
1a6f0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
1a700 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1a710 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  e );..  if( pPag
1a720 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20  er->tempFile.   
1a730 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
1a740 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a750 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26  cs(pPager->fd) &
1a760 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1a770 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1a780 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a790 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  )!=0.  ){.    /*
1a7a0 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65   Sector size doe
1a7b0 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20  sn't matter for 
1a7c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1a7d0 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a   Also, the file.
1a7e0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68      ** may not h
1a7f0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1a800 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61  yet, in which ca
1a810 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53  se the OsSectorS
1a820 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  ize().    ** cal
1a830 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e  l will segfault.
1a840 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1a850 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
1a860 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a870 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1a880 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f  e = sqlite3Secto
1a890 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
1a8a0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a8b0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
1a8c0 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
1a8d0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
1a8e0 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
1a8f0 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
1a900 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
1a910 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
1a920 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
1a930 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a940 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
1a950 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
1a960 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
1a970 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
1a980 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
1a990 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
1a9a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1a9b0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1a9c0 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
1a9d0 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
1a9e0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
1a9f0 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
1aa00 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1aa10 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
1aa20 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
1aa30 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
1aa40 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1aa50 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
1aa60 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1aa70 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1aa80 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
1aa90 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
1aaa0 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
1aab0 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
1aac0 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
1aad0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1aae0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
1aaf0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
1ab00 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
1ab10 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
1ab20 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
1ab30 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1ab40 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1ab50 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1ab60 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
1ab70 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
1ab80 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
1ab90 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
1aba0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1abb0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1abc0 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
1abd0 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64    (7)  zero padd
1abe0 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e  ing out to the n
1abf0 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  ext sector size.
1ac00 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f  .**  (8)  Zero o
1ac10 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73  r more pages ins
1ac20 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20  tances, each as 
1ac30 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20  follows:.**     
1ac40 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67     +  4 byte pag
1ac50 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20  e number..**    
1ac60 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70      +  pPager->p
1ac70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1ac80 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20   data..**       
1ac90 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b   +  4 byte check
1aca0 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77  sum.**.** When w
1acb0 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a  e speak of the j
1acc0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77  ournal header, w
1acd0 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74  e mean the first
1ace0 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a   7 items above..
1acf0 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e  ** Each entry in
1ad00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1ad10 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1ad20 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a  he 8th item..**.
1ad30 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75  ** Call the valu
1ad40 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e  e from the secon
1ad50 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e  d bullet "nRec".
1ad60 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75    nRec is the nu
1ad70 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64  mber of.** valid
1ad80 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e   page entries in
1ad90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
1ada0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f  n most cases, yo
1adb0 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68  u can compute th
1adc0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52  e.** value of nR
1add0 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65  ec from the size
1ade0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1adf0 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20  file.  But if a 
1ae00 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
1ae10 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
1ae20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
1ae30 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69  being written, i
1ae40 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a  t could be the.*
1ae50 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  * case that the 
1ae60 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1ae70 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72  nal file had alr
1ae80 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61  eady been increa
1ae90 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65  sed but.** the e
1aea0 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64  xtra entries had
1aeb0 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74   not yet made it
1aec0 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e   safely to disk.
1aed0 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65    In such a case
1aee0 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
1aef0 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  f nRec computed 
1af00 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1af10 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20  ze would be too 
1af20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74  large.  For.** t
1af30 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61  hat reason, we a
1af40 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52  lways use the nR
1af50 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  ec value in the 
1af60 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  header..**.** If
1af70 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
1af80 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74  is 0xffffffff it
1af90 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63   means that nRec
1afa0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1afb0 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ted.** from the 
1afc0 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73  file size.  This
1afd0 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77   value is used w
1afe0 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c  hen the user sel
1aff0 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73  ects the.** no-s
1b000 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74  ync option for t
1b010 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70  he journal.  A p
1b020 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
1b030 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75  ld lead to corru
1b040 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73  ption.** in this
1b050 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20   case.  But for 
1b060 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70  things like temp
1b070 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69  orary table (whi
1b080 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65  ch will be.** de
1b090 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
1b0a0 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64  ower is restored
1b0b0 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e  ) we don't care.
1b0c0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
1b0d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74  file opened as t
1b0e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b0f0 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f  is not a well-fo
1b100 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  rmed.** journal 
1b110 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61  file then all pa
1b120 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69  ges up to the fi
1b130 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61  rst corrupted pa
1b140 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a  ge are rolled.**
1b150 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67   back (or no pag
1b160 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  es if the journa
1b170 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72  l header is corr
1b180 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72  upted). The jour
1b190 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74  nal file.** is t
1b1a0 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20  hen deleted and 
1b1b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1b1c0 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e  ed, just as if n
1b1d0 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64  o corruption had
1b1e0 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  .** been encount
1b1f0 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ered..**.** If a
1b200 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  n I/O or malloc(
1b210 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
1b220 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  the journal-file
1b230 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a   is not deleted.
1b240 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ** and an error 
1b250 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1b260 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f  ..**.** The isHo
1b270 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  t parameter indi
1b280 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72  cates that we ar
1b290 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c  e trying to roll
1b2a0 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  back a journal.*
1b2b0 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  * that might be 
1b2c0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  a hot journal.  
1b2d0 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  Or, it could be 
1b2e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1b2f0 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65   is .** preserve
1b300 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55  d because of JOU
1b310 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
1b320 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f   or JOURNALMODE_
1b330 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20  TRUNCATE..** If 
1b340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c  the journal real
1b350 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74  ly is hot, reset
1b360 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
1b370 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a   prior rolling.*
1b380 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65  * back any conte
1b390 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72  nt.  If the jour
1b3a0 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65  nal is merely pe
1b3b0 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73  rsistent, no res
1b3c0 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e  et is.** needed.
1b3d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1b3e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
1b3f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
1b400 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
1b410 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
1b420 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
1b430 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
1b440 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b450 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1b460 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
1b470 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
1b480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b490 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
1b4a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
1b4b0 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4d0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1b4e0 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
1b4f0 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
1b500 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b510 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
1b520 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
1b530 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b540 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
1b550 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
1b560 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
1b570 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
1b580 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1b590 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1b5a0 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
1b5b0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
1b5c0 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
1b5d0 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
1b5e0 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
1b5f0 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67  */.  int needPag
1b600 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  erReset;      /*
1b610 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70   True to reset p
1b620 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72  age prior to fir
1b630 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b  st page rollback
1b640 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62   */.  int nPlayb
1b650 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ack = 0;       /
1b660 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1b670 66 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64  f pages restored
1b680 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
1b690 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1b6a0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1b6b0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1b6c0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1b6d0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1b6e0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1b6f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1b700 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1b710 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1b720 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1b730 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1b740 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1b750 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b760 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b770 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1b780 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1b790 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1b7a0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1b7b0 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1b7c0 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1b7d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1b7e0 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1b7f0 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1b800 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1b810 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1b820 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1b830 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1b840 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1b850 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1b860 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1b870 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1b880 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1b890 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1b8a0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1b8b0 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1b8c0 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1b8d0 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1b8e0 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1b8f0 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1b900 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1b910 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1b920 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1b930 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1b940 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
1b950 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
1b960 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1b970 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
1b980 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
1b990 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
1b9a0 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
1b9b0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1b9c0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1b9d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
1b9e0 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
1b9f0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
1ba00 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
1ba10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ba20 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
1ba30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ba40 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1ba50 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
1ba60 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
1ba70 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
1ba80 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
1ba90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
1baa0 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
1bab0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1bac0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
1bad0 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
1bae0 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
1baf0 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
1bb00 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
1bb10 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
1bb20 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
1bb30 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
1bb40 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1bb50 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
1bb60 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
1bb70 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
1bb80 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
1bb90 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1bba0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
1bbb0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
1bbc0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1bbd0 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
1bbe0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
1bbf0 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
1bc00 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
1bc10 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
1bc20 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
1bc30 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
1bc40 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
1bc50 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76  process must hav
1bc60 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  e failed while w
1bc70 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
1bc80 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
1bc90 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
1bca0 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
1bcb0 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
1bcc0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
1bcd0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73  alHdr(pPager, is
1bce0 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  Hot, szJ, &nRec,
1bcf0 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
1bd00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bd10 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
1bd20 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1bd30 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1bd40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1bd50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
1bd60 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
1bd70 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
1bd80 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1bd90 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
1bda0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
1bdb0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
1bdc0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
1bdd0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
1bde0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
1bdf0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
1be00 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
1be10 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
1be20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
1be30 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1be40 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
1be50 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
1be60 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
1be70 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
1be80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1be90 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
1bea0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1beb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1bec0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
1bed0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
1bee0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1bef0 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48  (szJ - JOURNAL_H
1bf00 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a  DR_SZ(pPager))/J
1bf10 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
1bf20 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
1bf30 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
1bf40 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
1bf50 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
1bf60 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
1bf70 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
1bf80 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68  rocess and if th
1bf90 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20  is is the final 
1bfa0 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f  header in the jo
1bfb0 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d  urnal, then it m
1bfc0 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  eans.    ** that
1bfd0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
1bfe0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bff0 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68  ing filled but h
1c000 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
1c010 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f      ** synced to
1c020 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20   disk.  Compute 
1c030 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c040 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ges based on the
1c050 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a   remaining.    *
1c060 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * size of the fi
1c070 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
1c080 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d  * The third term
1c090 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73   of the test was
1c0a0 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69   added to fix ti
1c0b0 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20  cket #2565..    
1c0c0 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  ** When rolling 
1c0d0 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e  back a hot journ
1c0e0 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61  al, nRec==0 alwa
1c0f0 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ys means that th
1c100 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68  e next.    ** ch
1c110 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  unk of the journ
1c120 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f  al contains zero
1c130 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c   pages to be rol
1c140 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20  led back.  But. 
1c150 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67     ** when doing
1c160 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20   a ROLLBACK and 
1c170 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e  the nRec==0 chun
1c180 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68  k is the last ch
1c190 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  unk in.    ** th
1c1a0 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65  e journal, it me
1c1b0 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  ans that the jou
1c1c0 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
1c1d0 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20  in additional.  
1c1e0 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20    ** pages that 
1c1f0 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65  need to be rolle
1c200 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  d back and that 
1c210 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1c220 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75  ges .    ** shou
1c230 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62  ld be computed b
1c240 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  ased on the jour
1c250 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20  nal file size.. 
1c260 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c270 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
1c280 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1c290 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
1c2a0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
1c2b0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
1c2c0 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
1c2d0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1c2e0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
1c2f0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
1c300 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
1c310 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1c320 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1c330 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
1c340 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
1c350 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
1c360 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1c370 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
1c380 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
1c390 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1c3a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1c3b0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
1c3c0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
1c3d0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1c3e0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1c3f0 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
1c400 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c410 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
1c420 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c430 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c440 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
1c450 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
1c460 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
1c470 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
1c480 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
1c490 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a   into the .    *
1c4a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1c4b0 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68  and/or page cach
1c4c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
1c4d0 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75  r(u=0; u<nRec; u
1c4e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  ++){.      if( n
1c4f0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b  eedPagerReset ){
1c500 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1c510 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1c520 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52        needPagerR
1c530 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  eset = 0;.      
1c540 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  }.      rc = pag
1c550 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1c560 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61  page(pPager,&pPa
1c570 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1c580 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66  0,1,0);.      if
1c590 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c5a0 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79  ){.        nPlay
1c5b0 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  back++;.      }e
1c5c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1c5d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c5e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c5f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c600 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
1c610 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c620 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
1c630 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1c640 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1c650 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
1c660 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74  urnal has been t
1c670 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79  runcated, simply
1c680 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e   stop reading an
1c690 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  d.          ** p
1c6a0 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f  rocessing the jo
1c6b0 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68  urnal. This migh
1c6c0 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  t happen if the 
1c6d0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
1c6e0 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d        ** not com
1c6f0 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20  pletely written 
1c700 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72  and synced prior
1c710 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e   to a crash.  In
1c720 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
1c730 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74  ** case, the dat
1c740 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76  abase should hav
1c750 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  e never been wri
1c760 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  tten in the.    
1c770 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70        ** first p
1c780 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b  lace so it is OK
1c790 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64   to simply aband
1c7a0 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  on the rollback.
1c7b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1c7c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c7d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1c7e0 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
1c7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c800 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
1c810 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
1c820 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65  ack, quit and re
1c830 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20  turn the error. 
1c840 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1c850 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75  .  This will cau
1c860 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  se the pager to 
1c870 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
1c880 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20  state.          
1c890 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75  ** so that no fu
1c8a0 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20  rther harm will 
1c8b0 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70  be done.  Perhap
1c8c0 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20  s the next.     
1c8d0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
1c8e0 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69  to come along wi
1c8f0 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f  ll be able to ro
1c900 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62  llback the datab
1c910 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1c920 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
1c930 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c950 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e  .    }.  }.  /*N
1c960 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73  OTREACHED*/.  as
1c970 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f  sert( 0 );..end_
1c980 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46  playback:.  /* F
1c990 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62  ollowing a rollb
1c9a0 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
1c9b0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1c9c0 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69   back in its ori
1c9d0 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65  ginal.  ** state
1c9e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
1c9f0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
1ca00 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b  action, so invok
1ca10 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  e the.  ** SQLIT
1ca20 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
1ca30 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f  NGED file-contro
1ca40 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61  l method to disa
1ca50 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73  ble the.  ** ass
1ca60 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20  ertion that the 
1ca70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1ca80 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64  ter was modified
1ca90 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
1caa0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
1cab0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1cac0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c  thods ){.    sql
1cad0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
1cae0 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
1caf0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
1cb00 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20  _UNCHANGED,0);. 
1cb10 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1cb20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
1cb30 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
1cb40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
1cb50 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
1cb60 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
1cb70 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
1cb80 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63  rred after the c
1cb90 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61  hange-counter wa
1cba0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20  s updated but . 
1cbb0 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74   ** before the t
1cbc0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63  ransaction was c
1cbd0 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74  ommitted, then t
1cbe0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cbf0 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61  r .  ** modifica
1cc00 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61  tion may just ha
1cc10 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64  ve been reverted
1cc20 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
1cc30 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a  s in exclusive .
1cc40 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1cc50 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73  subsequent trans
1cc60 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65  actions performe
1cc70 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74  d by the connect
1cc80 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a  ion will not.  *
1cc90 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  * update the cha
1cca0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61  nge-counter at a
1ccb0 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61  ll. This may lea
1ccc0 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e  d to cache incon
1ccd0 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72  sistency.  ** pr
1cce0 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72  oblems for other
1ccf0 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f   processes at so
1cd00 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
1cd10 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74  future. So, just
1cd20 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68  .  ** in case th
1cd30 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c  is has happened,
1cd40 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67   clear the chang
1cd50 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
1cd60 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  now..  */.  pPag
1cd70 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1cd80 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
1cd90 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72  mpFile;..  if( r
1cda0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1cdb0 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
1cdc0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1cdd0 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
1cde0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1cdf0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1ce00 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1ce10 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1ce20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
1ce30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1ce40 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1ce50 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61  TE_OK.   && (pPa
1ce60 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1ce70 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
1ce80 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1ce90 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20  e==PAGER_OPEN). 
1cea0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ceb0 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50  ite3PagerSync(pP
1cec0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
1ced0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cee0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1cef0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1cf00 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1cf10 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1cf20 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1cf30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1cf40 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1cf50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1cf60 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1cf70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1cf80 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1cf90 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1cfa0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1cfb0 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1cfc0 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1cfd0 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1cfe0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1cff0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1d000 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1d010 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1d020 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1d030 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1d040 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1d050 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79  ( isHot && nPlay
1d060 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  back ){.    sqli
1d070 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
1d080 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
1d090 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72  LLBACK, "recover
1d0a0 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d  ed %d pages from
1d0b0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
1d0c0 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c        nPlayback,
1d0d0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1d0e0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  l);.  }..  /* Th
1d0f0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
1d100 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
1d110 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
1d120 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
1d130 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
1d140 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
1d150 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
1d160 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
1d170 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
1d180 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
1d190 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
1d1a0 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
1d1b0 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
1d1c0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1d1d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d1e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1d1f0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65  content for page
1d200 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
1d210 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1d220 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e  d into .** pPg->
1d230 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64 20  pData. A shared 
1d240 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
1d250 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e 20  must be held on 
1d260 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1d270 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69 73  file before this
1d280 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1d290 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  led..**.** If pa
1d2a0 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74 68  ge 1 is read, th
1d2b0 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  en the value of 
1d2c0 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
1d2d0 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  [] is set to.** 
1d2e0 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
1d2f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1d300 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1d310 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1d320 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  rs, then the IO 
1d330 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1d340 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1d350 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 53  .** Otherwise, S
1d360 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1d370 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1d380 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28 50  int readDbPage(P
1d390 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20 69  gHdr *pPg, u32 i
1d3a0 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72 20  Frame){.  Pager 
1d3b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d3c0 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1d3d0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1d3e0 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1d3f0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
1d400 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
1d410 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
1d420 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
1d430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d440 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1d450 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1d460 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65 72  nt pgsz = pPager
1d470 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20 4e  ->pageSize; /* N
1d480 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1d490 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73  o read */..  ass
1d4a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1d4b0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45  ate>=PAGER_READE
1d4c0 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20  R && !MEMDB );. 
1d4d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1d4e0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a  pPager->fd) );..
1d4f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d500 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69 46  MIT_WAL.  if( iF
1d510 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  rame ){.    /* T
1d520 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20 70  ry to pull the p
1d530 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72 69  age from the wri
1d540 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a 2f  te-ahead log. */
1d550 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d560 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70 50  3WalReadFrame(pP
1d570 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61  ager->pWal, iFra
1d580 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70  me, pgsz, pPg->p
1d590 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  Data);.  }else.#
1d5a0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69 36  endif.  {.    i6
1d5b0 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e  4 iOffset = (pgn
1d5c0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
1d5d0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1d5e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1d5f0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
1d600 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c  Pg->pData, pgsz,
1d610 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69   iOffset);.    i
1d620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d630 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d640 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1d650 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1d660 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  }..  if( pgno==1
1d670 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29   ){.    if( rc )
1d680 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
1d690 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63 63  e read is unsucc
1d6a0 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20  essful, set the 
1d6b0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20  dbFileVers[] to 
1d6c0 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20  something.      
1d6d0 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76  ** that will nev
1d6e0 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66 69  er be a valid fi
1d6f0 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46  le version.  dbF
1d700 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63  ileVers[] is a c
1d710 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  opy.      ** of 
1d720 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20  bytes 24..39 of 
1d730 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 42  the database.  B
1d740 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75  ytes 28..31 shou
1d750 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20  ld always be.   
1d760 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68     ** zero or th
1d770 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1d780 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20  tabase in page. 
1d790 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64  Bytes 32..35 and
1d7a0 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a   35..39.      **
1d7b0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20   should be page 
1d7c0 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
1d7d0 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66  e never 0xffffff
1d7e0 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a  ff.  So filling.
1d7f0 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d        ** pPager-
1d800 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69  >dbFileVers[] wi
1d810 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65  th all 0xff byte
1d820 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65  s should suffice
1d830 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d840 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79   ** For an encry
1d850 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74  pted database, t
1d860 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20  he situation is 
1d870 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62  more complex:  b
1d880 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34  ytes.      ** 24
1d890 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1d8a0 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e  base are white n
1d8b0 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70  oise.  But the p
1d8c0 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20  robability of.  
1d8d0 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69      ** white noi
1d8e0 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  se equaling 16 b
1d8f0 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1d900 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1d910 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1d920 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1d930 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1d940 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1d950 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1d960 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1d970 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1d980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d990 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1d9a0 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1d9b0 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1d9c0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1d9d0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d9e0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d9f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1da00 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1da10 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1da20 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1da30 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1da40 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1da50 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1da60 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1da70 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1da80 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1da90 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1daa0 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1dab0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1dac0 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1dad0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1dae0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1db00 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1db10 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1db20 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1db30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1db40 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1db50 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1db60 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1db70 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1db80 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1db90 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1dba0 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1dbb0 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1dbc0 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1dbd0 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1dbe0 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1dbf0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1dc00 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1dc10 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1dc20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1dc30 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1dc40 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1dc50 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1dc60 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1dc70 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1dc80 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1dc90 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1dca0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1dcb0 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1dcc0 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1dcd0 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1dce0 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1dcf0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1dd00 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1dd10 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1dd20 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1dd30 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1dd40 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1dd50 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1dd60 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1dd70 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1dd80 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1dd90 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1dda0 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1ddb0 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1ddc0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1ddd0 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1dde0 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1ddf0 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1de00 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1de10 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1de20 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1de30 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1de40 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1de50 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1de60 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1de70 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1de80 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1de90 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1dea0 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1deb0 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1dec0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1ded0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1dee0 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1def0 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1df00 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1df10 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1df20 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1df30 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1df40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1df50 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1df60 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1df70 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1df80 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1df90 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1dfa0 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1dfb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1dfc0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1dfd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1dfe0 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1dff0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1e000 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1e010 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1e020 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1e030 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1e040 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1e050 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1e060 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1e070 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1e080 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1e090 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e0a0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1e0b0 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1e0c0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1e0d0 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1e0e0 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1e0f0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1e100 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1e110 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1e120 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1e130 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1e140 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1e150 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1e160 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1e170 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1e180 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1e190 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1e1a0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1e1b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1e1c0 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1e1d0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1e1e0 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1e1f0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1e200 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1e210 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1e220 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1e230 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1e240 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1e250 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1e260 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1e270 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1e280 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e290 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1e2a0 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1e2b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e2c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e2d0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1e2e0 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1e2f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1e300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e310 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1e320 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1e330 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e340 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
1e350 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ull(pPg);.    }.
1e360 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
1e370 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61 63  ly, if a transac
1e380 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
1e390 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70 20  ack, any backup 
1e3a0 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20 20  processes are.  
1e3b0 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64 61  ** updated as da
1e3c0 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75 74  ta is copied out
1e3d0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
1e3e0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74   journal and int
1e3f0 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
1e400 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ase. This is not
1e410 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69   generally possi
1e420 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20 64  ble with a WAL d
1e430 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a  atabase, as.  **
1e440 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76   rollback involv
1e450 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63 61  es simply trunca
1e460 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ting the log fil
1e470 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69 66  e. Therefore, if
1e480 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72   one.  ** or mor
1e490 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61 6c  e frames have al
1e4a0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e4b0 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28 61  en to the log (a
1e4c0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20 20  nd therefore .  
1e4d0 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20 69  ** also copied i
1e4e0 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20 64  nto the backup d
1e4f0 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61 72  atabases) as par
1e500 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
1e510 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20  ction,.  ** the 
1e520 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65 20  backups must be 
1e530 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a  restarted..  */.
1e540 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
1e550 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
1e560 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75  Backup);..  retu
1e570 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e580 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e590 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62   called to rollb
1e5a0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
1e5b0 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62  n on a WAL datab
1e5c0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1e5d0 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  nt pagerRollback
1e5e0 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
1e5f0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1e600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e610 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1e620 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72 20  Code */.  PgHdr 
1e630 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1e640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1e650 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1e660 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20   to revert */.. 
1e670 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67 65   /* For all page
1e680 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  s in the cache t
1e690 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c  hat are currentl
1e6a0 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65 20  y dirty or have 
1e6b0 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65  already.  ** bee
1e6c0 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20 6e  n written (but n
1e6d0 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f  ot committed) to
1e6e0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64   the log file, d
1e6f0 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20 20  o one of the .  
1e700 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20  ** following:.  
1e710 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73 63  **.  **   + Disc
1e720 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20 70  ard the cached p
1e730 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  age (if refcount
1e740 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  ==0), or.  **   
1e750 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63 6f  + Reload page co
1e760 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64  ntent from the d
1e770 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66 63  atabase (if refc
1e780 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20  ount>0)..  */.  
1e790 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1e7a0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1e7b0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1e7c0 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67 65  te3WalUndo(pPage
1e7d0 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55 6e  r->pWal, pagerUn
1e7e0 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  doCallback, (voi
1e7f0 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20 70  d *)pPager);.  p
1e800 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1e810 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1e820 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1e830 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 26    while( pList &
1e840 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1e850 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4e  ){.    PgHdr *pN
1e860 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ext = pList->pDi
1e870 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rty;.    rc = pa
1e880 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28  gerUndoCallback(
1e890 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
1e8a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
1e8b0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
1e8c0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1e8d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e8e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77   function is a w
1e8f0 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
1e900 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 29  lite3WalFrames()
1e910 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67  . As well as log
1e920 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  ging.** the cont
1e930 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73 74  ents of the list
1e940 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65 64   of pages headed
1e950 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65   by pList (conne
1e960 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29 2c  cted by pDirty),
1e970 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1e980 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20 61  n notifies any a
1e990 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72 6f  ctive backup pro
1e9a0 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65 20  cesses that the 
1e9b0 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63 68  pages have.** ch
1e9c0 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  anged. .**.** Th
1e9d0 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1e9e0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69 73  passed into this
1e9f0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77 61   routine is alwa
1ea00 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61 67  ys sorted by pag
1ea10 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e  e number..** Hen
1ea20 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61 70  ce, if page 1 ap
1ea30 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20 6f  pears anywhere o
1ea40 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20 77  n the list, it w
1ea50 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73 74  ill be the first
1ea60 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69   page..*/ .stati
1ea70 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46 72  c int pagerWalFr
1ea80 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a 70  ames(.  Pager *p
1ea90 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20  Pager,          
1eaa0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1eab0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48   object */.  PgH
1eac0 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20  dr *pList,      
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eae0 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74  List of frames t
1eaf0 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  o log */.  Pgno 
1eb00 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20  nTruncate,      
1eb10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
1eb20 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74 65  tabase size afte
1eb30 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f  r this commit */
1eb40 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1eb70 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a  is is a commit *
1eb80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1ebb0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
1ebc0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
1ebd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ebe0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1ebf0 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48 64   pList */.  PgHd
1ec00 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ec20 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1ec30 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  pages */..  asse
1ec40 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
1ec50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1ec60 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ist );.#ifdef SQ
1ec70 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
1ec80 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1ec90 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e 20  page list is in 
1eca0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
1ecb0 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  */.  for(p=pList
1ecc0 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74 79  ; p && p->pDirty
1ecd0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1ece0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1ecf0 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d  gno < p->pDirty-
1ed00 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e  >pgno );.  }.#en
1ed10 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1ed20 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20  List->pDirty==0 
1ed30 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20  || isCommit );. 
1ed40 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b   if( isCommit ){
1ed50 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41 4c  .    /* If a WAL
1ed60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ed70 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c  being committed,
1ed80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69   there is no poi
1ed90 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20 20  nt in writing.  
1eda0 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20 77    ** any pages w
1edb0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1edc0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e 54   greater than nT
1edd0 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68 65  runcate into the
1ede0 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a   WAL file..    *
1edf0 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76 65  * They will neve
1ee00 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e 79  r be read by any
1ee10 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f   client. So remo
1ee20 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
1ee30 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c   pDirty.    ** l
1ee40 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ist here. */.   
1ee50 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74 20   PgHdr **ppNext 
1ee60 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c  = &pList;.    nL
1ee70 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ist = 0;.    for
1ee80 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65  (p=pList; (*ppNe
1ee90 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d  xt = p)!=0; p=p-
1eea0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1eeb0 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72  if( p->pgno<=nTr
1eec0 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1eed0 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70    ppNext = &p->p
1eee0 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20 6e  Dirty;.        n
1eef0 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  List++;.      }.
1ef00 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1ef10 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c  ( pList );.  }el
1ef20 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20  se{.    nList = 
1ef30 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  1;.  }.  pPager-
1ef40 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
1ef50 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73  T_WRITE] += nLis
1ef60 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d  t;..  if( pList-
1ef70 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72  >pgno==1 ) pager
1ef80 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75  _write_changecou
1ef90 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20 72  nter(pList);.  r
1efa0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 72  c = sqlite3WalFr
1efb0 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57 61  ames(pPager->pWa
1efc0 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  l, .      pPager
1efd0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69 73  ->pageSize, pLis
1efe0 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69 73  t, nTruncate, is
1eff0 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e  Commit, pPager->
1f000 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20 29  walSyncFlags.  )
1f010 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1f020 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
1f030 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
1f040 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
1f050 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1f060 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1f070 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1f080 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f  pBackup, p->pgno
1f090 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74 61  , (u8 *)p->pData
1f0a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69  );.    }.  }..#i
1f0b0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1f0c0 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74 20  K_PAGES.  pList 
1f0d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
1f0e0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
1f0f0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f 72  >pPCache);.  for
1f100 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1f110 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 70  ->pDirty){.    p
1f120 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
1f130 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  h(p);.  }.#endif
1f140 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f150 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20  ../*.** Begin a 
1f160 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1f170 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a   on the WAL..**.
1f180 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f190 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  used to be calle
1f1a0 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61 70  d "pagerOpenSnap
1f1b0 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65 20  shot()" because 
1f1c0 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a  it essentially.*
1f1d0 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73 68  * makes a snapsh
1f1e0 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ot of the databa
1f1f0 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  se at the curren
1f200 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20  t point in time 
1f210 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a 2a  and preserves.**
1f220 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20 66   that snapshot f
1f230 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72 65  or use by the re
1f240 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f 66  ader in spite of
1f250 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63 68   concurrently ch
1f260 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65  anges by.** othe
1f270 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68 65  r writers or che
1f280 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  ckpointers..*/.s
1f290 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 42  tatic int pagerB
1f2a0 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
1f2b0 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
1f2c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
1f2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f2f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68  code */.  int ch
1f300 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20 20  anged = 0;      
1f310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1f320 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74 20  e if cache must 
1f330 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61  be reset */..  a
1f340 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57  ssert( pagerUseW
1f350 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
1f360 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f370 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
1f380 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
1f390 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
1f3a0 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  ER );..  /* sqli
1f3b0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
1f3c0 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
1f3d0 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
1f3e0 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
1f3f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
1f400 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
1f410 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
1f420 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
1f430 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
1f440 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
1f450 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
1f460 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1f470 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
1f480 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
1f490 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
1f4a0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f4b0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
1f4c0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
1f4d0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
1f4e0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
1f4f0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
1f500 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
1f510 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f520 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20 20  || changed ){.  
1f530 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
1f540 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 55  ager);.    if( U
1f550 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
1f560 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74  ) sqlite3OsUnfet
1f570 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ch(pPager->fd, 0
1f580 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
1f590 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
1f5a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f5b0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1f5c0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  as part of the t
1f5d0 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50  ransition from P
1f5e0 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20  AGER_OPEN.** to 
1f5f0 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61  PAGER_READER sta
1f600 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  te to determine 
1f610 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f620 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1f630 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75 6d   in pages (assum
1f640 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69 7a  ing the page siz
1f650 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  e currently stor
1f660 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67 65  ed in Pager.page
1f670 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Size)..**.** If 
1f680 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1f690 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1f6a0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73  turned and the s
1f6b0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1f6c0 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ase.** in pages 
1f6d0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e  is stored in *pn
1f6e0 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  Page. Otherwise,
1f6f0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
1f700 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54  perhaps.** SQLIT
1f710 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20 69  E_IOERR_FSTAT) i
1f720 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1f730 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75  pnPage is left u
1f740 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
1f750 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
1f760 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
1f770 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50  Pager, Pgno *pnP
1f780 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61  age){.  Pgno nPa
1f790 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1f7a0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1f7b0 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
1f7c0 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
1f7d0 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73 75  Query the WAL su
1f7e0 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  b-system for the
1f7f0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e 20   database size. 
1f800 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29 0a  The WalDbsize().
1f810 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65    ** function re
1f820 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74 68  turns zero if th
1f830 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65  e WAL is not ope
1f840 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70 57  n (i.e. Pager.pW
1f850 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20  al==0), or.  ** 
1f860 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1f870 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61 69  size is not avai
1f880 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 62  lable. The datab
1f890 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a  ase size is not.
1f8a0 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
1f8b0 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62 2d  rom the WAL sub-
1f8c0 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c 6f  system if the lo
1f8d0 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 20  g file is empty 
1f8e0 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73  or.  ** contains
1f8f0 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74   no valid commit
1f900 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ted transactions
1f910 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1f920 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
1f930 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
1f940 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f950 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c  >eLock>=SHARED_L
1f960 4f 43 4b 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d  OCK );.  nPage =
1f970 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a   sqlite3WalDbsiz
1f980 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  e(pPager->pWal);
1f990 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75  ..  /* If the nu
1f9a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1f9b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1f9c0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1f9d0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c  rom the.  ** WAL
1f9e0 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74   sub-system, det
1f9f0 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20  ermine the page 
1fa00 63 6f 75 6e 74 65 20 62 61 73 65 64 20 6f 6e 20  counte based on 
1fa10 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a  the size of.  **
1fa20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fa30 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65  le.  If the size
1fa40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1fa50 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a   file is not an.
1fa60 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c    ** integer mul
1fa70 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67  tiple of the pag
1fa80 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70  e-size, round up
1fa90 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a   the result..  *
1faa0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
1fab0 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1fac0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fad0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1fae0 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1faf0 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1fb00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1fb10 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1fb20 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1fb30 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1fb40 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1fb50 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1fb60 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1fb70 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1fb80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fb90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1fba0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1fbb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1fbc0 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
1fbd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
1fbe0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1fbf0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
1fc00 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1fc10 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1fc20 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1fc30 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1fc40 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1fc50 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1fc60 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1fc70 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1fc80 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1fc90 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1fca0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1fcb0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1fcc0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1fcd0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1fce0 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1fcf0 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1fd00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd10 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1fd20 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1fd30 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1fd40 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1fd50 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1fd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1fd70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1fd80 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1fd90 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1fda0 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1fdb0 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1fdc0 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1fdd0 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1fde0 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1fdf0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1fe00 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1fe10 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1fe20 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1fe30 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1fe40 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1fe50 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1fe60 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1fe70 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1fe80 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1fe90 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1fea0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1feb0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1fec0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1fed0 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1fee0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1fef0 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1ff00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1ff10 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1ff20 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1ff30 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1ff40 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1ff50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1ff60 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1ff70 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1ff80 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1ff90 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1ffa0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1ffb0 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1ffc0 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1ffd0 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1ffe0 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1fff0 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
20000 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
20010 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
20020 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
20030 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
20040 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
20050 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
20060 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20070 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
20080 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
20090 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
200a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
200b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
200c0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
200d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
200e0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
200f0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
20100 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
20110 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
20120 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
20130 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20140 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
20150 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
20160 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
20170 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
20180 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20190 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
201a0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
201b0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
201c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
201d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
201e0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
201f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20200 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
20210 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
20220 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
20230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
20240 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
20250 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
20260 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  OK;.      isWal 
20270 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
20280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20290 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
202a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
202b0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
202c0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
202d0 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
202e0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
202f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
20310 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
20320 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
20330 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
20340 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
20350 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
20360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20370 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
20380 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
20390 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
203a0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
203b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
203c0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
203d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
203e0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
203f0 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
20400 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
20410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
20420 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
20430 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
20440 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
20450 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
20460 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
20470 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
20480 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20490 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
204a0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
204b0 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
204c0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
204d0 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
204e0 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
204f0 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
20500 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
20510 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
20520 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
20530 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
20540 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
20550 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
20560 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
20570 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
20580 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
20590 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
205a0 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
205b0 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
205c0 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
205d0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
205e0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
205f0 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
20600 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
20610 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
20620 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
20630 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
20640 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
20650 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
20660 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
20670 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20680 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
20690 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
206a0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
206b0 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
206c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
206d0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
206e0 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
206f0 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
20700 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
20710 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
20720 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
20730 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
20740 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
20750 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20760 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20770 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20780 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
20790 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
207a0 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
207b0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
207c0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
207d0 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
207e0 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
207f0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
20800 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
20810 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
20820 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
20830 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20840 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
20850 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
20860 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
20870 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
20880 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
20890 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
208a0 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
208b0 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
208c0 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
208d0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
208e0 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
208f0 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
20900 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
20910 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
20920 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
20930 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
20940 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
20950 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
20960 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
20970 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
20980 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
20990 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
209a0 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
209b0 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
209c0 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
209d0 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
209e0 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
209f0 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
20a00 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
20a10 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
20a20 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
20a30 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
20a40 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
20a50 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20a60 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
20a70 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
20a80 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
20a90 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
20aa0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
20ab0 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
20ac0 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
20ad0 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
20ae0 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
20af0 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
20b00 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
20b10 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
20b20 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
20b30 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
20b40 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
20b50 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
20b60 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
20b70 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
20b80 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
20b90 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
20ba0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
20bb0 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
20bc0 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
20bd0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
20be0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20bf0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20c00 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
20c10 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
20c20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
20c30 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
20c40 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
20c50 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
20c60 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
20c70 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
20c80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20c90 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
20ca0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
20cb0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
20cc0 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
20cd0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
20ce0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
20cf0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
20d00 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20d10 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
20d20 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
20d30 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
20d40 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
20d50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20d60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20d70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
20d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
20d90 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
20da0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
20db0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
20dc0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
20dd0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
20de0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
20df0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
20e00 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
20e10 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
20e20 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
20e30 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20e40 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20e50 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20e60 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20e70 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20e80 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
20e90 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
20ea0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
20eb0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
20ec0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20ed0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
20ee0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
20ef0 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
20f00 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
20f10 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
20f20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
20f30 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
20f40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20f50 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
20f60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
20f70 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20f80 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
20f90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
20fa0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
20fb0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
20fc0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
20fd0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
20fe0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20ff0 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
21000 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
21010 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
21020 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
21030 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
21040 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
21050 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
21060 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
21070 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
21080 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
21090 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
210a0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
210b0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
210c0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
210d0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
210e0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
210f0 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
21100 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
21110 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
21120 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
21130 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
21140 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
21150 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
21160 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
21170 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
21180 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
21190 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
211a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
211b0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
211c0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
211d0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
211e0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
211f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
21200 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
21210 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
21220 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
21230 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
21240 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
21250 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
21260 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21270 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21280 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
21290 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
212a0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
212b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
212c0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
212d0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
212e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
212f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
21300 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
21310 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
21320 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21330 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21340 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
21350 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
21360 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
21370 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
21380 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
21390 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
213a0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
213b0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
213c0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
213d0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
213e0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
213f0 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
21400 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
21410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21420 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21430 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
21440 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21450 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21460 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
21470 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
21480 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
21490 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
214a0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
214b0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
214c0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
214d0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
214e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
214f0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
21500 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
21510 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
21520 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21530 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21540 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21550 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
21560 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
21570 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
21580 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
21590 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
215a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
215b0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
215c0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
215d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
215e0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
215f0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
21600 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
21610 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
21620 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
21630 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
21640 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
21650 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
21660 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
21670 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
21680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
21690 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
216a0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
216b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
216c0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
216d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
216e0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
216f0 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21700 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21710 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21720 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21730 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21740 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
21750 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
21760 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
21770 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
21780 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
21790 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
217a0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
217b0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
217c0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
217d0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
217e0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
217f0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
21800 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
21810 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21820 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
21830 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
21840 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
21850 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21860 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
21870 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21880 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
21890 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
218a0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
218b0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
218c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
218d0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
218e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
218f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21900 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
21910 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
21920 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
21930 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
21940 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
21950 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
21960 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21970 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
21980 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
21990 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
219a0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
219b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
219c0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
219d0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
219e0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
219f0 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
21a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21a10 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21a20 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
21a30 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
21a40 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
21a50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21a60 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
21a70 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
21a80 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
21a90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
21aa0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
21ab0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
21ac0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
21ad0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f   allowed.** befo
21ae0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
21af0 20 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61   recycle clean a
21b00 6e 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e  nd unused pages.
21b10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21b20 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
21b30 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
21b40 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
21b50 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
21b60 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
21b70 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
21b80 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  e);.}../*.** Cha
21b90 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
21ba0 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
21bb0 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
21bc0 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65  re allowed.** be
21bd0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
21be0 74 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74  to spill pages t
21bf0 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  o journal..*/.in
21c00 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
21c10 74 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72  tSpillsize(Pager
21c20 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
21c30 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
21c40 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
21c50 53 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72  Spillsize(pPager
21c60 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
21c70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  e);.}../*.** Inv
21c80 6f 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  oke SQLITE_FCNTL
21c90 5f 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64  _MMAP_SIZE based
21ca0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
21cb0 76 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e  value of szMmap.
21cc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21cd0 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74  pagerFixMaplimit
21ce0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21cf0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
21d00 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71  MMAP_SIZE>0.  sq
21d10 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
21d20 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69   pPager->fd;.  i
21d30 66 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26  f( isOpen(fd) &&
21d40 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69   fd->pMethods->i
21d50 56 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20  Version>=3 ){.  
21d60 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
21d70 73 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61  sz;.    sz = pPa
21d80 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20  ger->szMmap;.   
21d90 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
21da0 63 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20  ch = (sz>0);.   
21db0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
21dc0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
21dd0 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
21de0 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73  TL_MMAP_SIZE, &s
21df0 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  z);.  }.#endif.}
21e00 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21e10 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
21e20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61  of any memory ma
21e30 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74 68  pping made of th
21e40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21e50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
21e60 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
21e70 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
21e80 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
21e90 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65 72  zMmap){.  pPager
21ea0 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61  ->szMmap = szMma
21eb0 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61 70  p;.  pagerFixMap
21ec0 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 7d  limit(pPager);.}
21ed0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20  ../*.** Free as 
21ee0 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
21ef0 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68 65  ossible from the
21f00 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20   pager..*/.void 
21f10 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69  sqlite3PagerShri
21f20 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nk(Pager *pPager
21f30 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
21f40 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72 2d  heShrink(pPager-
21f50 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
21f60 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74 69  .** Adjust setti
21f70 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  ngs of the pager
21f80 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
21f90 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c 61  ied in the pgFla
21fa0 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  gs parameter..**
21fb0 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22 20  .** The "level" 
21fc0 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41 47  in pgFlags & PAG
21fd0 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d  ER_SYNCHRONOUS_M
21fe0 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f 62  ASK sets the rob
21ff0 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68  ustness.** of th
22000 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
22010 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
22020 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72 20  rashes or power 
22030 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63  failures by.** c
22040 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
22050 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
22060 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  hen writing the 
22070 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
22080 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
22090 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
220a0 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
220b0 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
220c0 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
220d0 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
220f0 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
22100 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
22110 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
22120 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
22130 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
22140 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
22150 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
22160 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
22170 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
22180 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
22190 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
221a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
221b0 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
221c0 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
221d0 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
221e0 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
221f0 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
22200 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
22210 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
22220 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
22230 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
22240 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
22250 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
22260 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
22270 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22280 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
22290 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
222a0 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
222b0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
222c0 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
222d0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
222e0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
222f0 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
22300 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
22310 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
22320 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
22340 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
22350 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
22360 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
22370 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
22380 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
22390 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
223a0 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
223b0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
223c0 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
223d0 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
223e0 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
223f0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
22400 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
22410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
22420 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
22430 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
22440 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
22450 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
22460 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
22470 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
22480 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f  k..**.** The abo
22490 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c  ve is for a roll
224a0 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  back-journal mod
224b0 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65  e.  For WAL mode
224c0 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a  , OFF continues.
224d0 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20  ** to mean that 
224e0 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63  no syncs ever oc
224f0 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61  cur.  NORMAL mea
22500 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20  ns that the WAL 
22510 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69  is synced.** pri
22520 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
22530 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  of checkpoint an
22540 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
22550 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63  ase file is sync
22560 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ed.** at the con
22570 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  clusion of the c
22580 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
22590 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
225a0 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61  of the WAL.** wa
225b0 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  s written back i
225c0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
225d0 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f  .  But no sync o
225e0 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20  perations occur 
225f0 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  for.** an ordina
22600 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52  ry commit in NOR
22610 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41  MAL mode with WA
22620 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74  L.  FULL means t
22630 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66  hat the WAL.** f
22640 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f  ile is synced fo
22650 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d  llowing each com
22660 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  mit operation, i
22670 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
22680 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63  e.** syncs assoc
22690 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41  iated with NORMA
226a0 4c 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  L..**.** Do not 
226b0 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e  confuse synchron
226c0 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51  ous=FULL with SQ
226d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20  LITE_SYNC_FULL. 
226e0 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   The.** SQLITE_S
226f0 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d  YNC_FULL macro m
22700 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20  eans to use the 
22710 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c  MacOSX-style ful
22720 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67  l-fsync.** using
22730 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59   fcntl(F_FULLFSY
22740 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e  NC).  SQLITE_SYN
22750 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74  C_NORMAL means t
22760 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  o do an.** ordin
22770 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c  ary fsync() call
22780 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
22790 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
227a0 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  n SQLITE_SYNC_FU
227b0 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45  LL.** and SQLITE
227c0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20  _SYNC_NORMAL on 
227d0 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20  platforms other 
227e0 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75  than MacOSX.  Bu
227f0 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f  t the.** synchro
22800 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73  nous=FULL versus
22810 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
22820 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65  MAL setting dete
22830 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74  rmines when.** t
22840 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69  he xSync primiti
22850 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  ve is called and
22860 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20   is relevant to 
22870 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a  all platforms..*
22880 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
22890 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
228a0 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
228b0 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
228c0 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
228d0 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
228e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
228f0 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
22900 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
22910 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70  lags(.  Pager *p
22920 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
22930 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65   The pager to se
22940 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66  t safety level f
22950 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  or */.  unsigned
22960 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a   pgFlags      /*
22970 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a   Various flags *
22980 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
22990 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20  level = pgFlags 
229a0 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
229b0 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65  OUS_MASK;.  asse
229c0 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
229d0 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50  level<=3 );.  pP
229e0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
229f0 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
22a00 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
22a10 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
22a20 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
22a30 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
22a40 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
22a50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
22a60 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
22a70 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
22a80 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  0;.    pPager->c
22a90 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30  kptSyncFlags = 0
22aa0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67  ;.  }else if( pg
22ab0 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55  Flags & PAGER_FU
22ac0 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70  LLFSYNC ){.    p
22ad0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
22ae0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
22af0 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ULL;.    pPager-
22b00 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
22b10 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22b20 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  L;.  }else if( p
22b30 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43  gFlags & PAGER_C
22b40 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b  KPT_FULLFSYNC ){
22b50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22b60 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22b70 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22b80 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22b90 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22ba0 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c  SYNC_FULL;.  }el
22bb0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
22bc0 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22bd0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
22be0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22bf0 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
22c00 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a  TE_SYNC_NORMAL;.
22c10 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61    }.  pPager->wa
22c20 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61  lSyncFlags = pPa
22c30 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
22c40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
22c50 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  llSync ){.    pP
22c60 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
22c70 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54  gs |= WAL_SYNC_T
22c80 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d  RANSACTIONS;.  }
22c90 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73 20 26  .  if( pgFlags &
22ca0 20 50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c   PAGER_CACHESPIL
22cb0 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  L ){.    pPager-
22cc0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e  >doNotSpill &= ~
22cd0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
22ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
22cf0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c  er->doNotSpill |
22d00 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b  = SPILLFLAG_OFF;
22d10 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
22d20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
22d30 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
22d40 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
22d50 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
22d60 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
22d70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
22d80 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
22d90 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
22da0 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
22db0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
22dc0 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
22dd0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
22de0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
22df0 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
22e00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
22e10 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
22e20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74  file..**.** Writ
22e30 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
22e40 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c  iptor into *pFil
22e50 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  e. Return SQLITE
22e60 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a  _OK on success .
22e70 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
22e80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
22e90 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77  e fail. The OS w
22ea0 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
22eb0 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  y .** delete the
22ec0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
22ed0 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
22ee0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  d..**.** The fla
22ef0 67 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  gs passed to the
22f00 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e   VFS layer xOpen
22f10 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73  () call are thos
22f20 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  e specified.** b
22f30 79 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46  y parameter vfsF
22f40 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74  lags ORed with t
22f50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
22f60 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
22f70 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a  PEN_READWRITE.**
22f80 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22f90 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53  _CREATE.**     S
22fa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
22fb0 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  SIVE.**     SQLI
22fc0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
22fd0 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20  CLOSE.*/.static 
22fe0 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  int pagerOpentem
22ff0 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  p(.  Pager *pPag
23000 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
23010 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  e pager object *
23020 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
23030 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69   *pFile,  /* Wri
23040 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
23050 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20  riptor here */. 
23060 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
23070 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
23080 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
23090 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a  o the VFS */.){.
230a0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
230b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
230c0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65  n code */..#ifde
230d0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
230e0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
230f0 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73  _count++;  /* Us
23100 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
23110 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
23120 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66   */.#endif..  vf
23130 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54  sFlags |=  SQLIT
23140 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
23150 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
23160 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
23170 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
23180 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49  EXCLUSIVE | SQLI
23190 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
231a0 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71  CLOSE;.  rc = sq
231b0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67  lite3OsOpen(pPag
231c0 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69  er->pVfs, 0, pFi
231d0 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29  le, vfsFlags, 0)
231e0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
231f0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
23200 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20  pen(pFile) );.  
23210 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23220 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
23230 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f   handler functio
23240 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  n..**.** The pag
23250 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62  er invokes the b
23260 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73  usy-handler if s
23270 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72  qlite3OsLock() r
23280 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
23290 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72 79 69  E_BUSY when tryi
232a0 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
232b0 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20  om no-lock to a 
232c0 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20  SHARED lock,.** 
232d0 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74  or when trying t
232e0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
232f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74   RESERVED lock t
23300 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a  o an EXCLUSIVE .
23310 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73  ** lock. It does
23320 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68   *not* invoke th
23330 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77  e busy handler w
23340 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
23350 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20  om.** SHARED to 
23360 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65  RESERVED, or whe
23370 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
23380 20 53 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55   SHARED to EXCLU
23390 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f  SIVE.** (which o
233a0 63 63 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74  ccurs during hot
233b0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
233c0 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a  k). Summary:.**.
233d0 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20  **   Transition 
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233f0 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73         | Invokes
23400 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a   xBusyHandler.**
23410 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
23420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
23450 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d   NO_LOCK       -
23460 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20  > SHARED_LOCK   
23470 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48     | Yes.**   SH
23480 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52  ARED_LOCK   -> R
23490 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20  ESERVED_LOCK    
234a0 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44  | No.**   SHARED
234b0 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55  _LOCK   -> EXCLU
234c0 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f  SIVE_LOCK   | No
234d0 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c  .**   RESERVED_L
234e0 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  OCK -> EXCLUSIVE
234f0 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a  _LOCK   | Yes.**
23500 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d  .** If the busy-
23510 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
23520 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
23530 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a  o, the lock is .
23540 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66 20 69  ** retried. If i
23550 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20  t returns zero, 
23560 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  then the SQLITE_
23570 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a  BUSY error is.**
23580 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
23590 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70   caller of the p
235a0 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
235b0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
235c0 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
235d0 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a  ndler(.  Pager *
235e0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23600 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
23610 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61  .  int (*xBusyHa
23620 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20  ndler)(void *), 
23630 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
23640 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c  er to busy-handl
23650 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  er function */. 
23660 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
23670 6c 65 72 41 72 67 20 20 20 20 20 20 20 20 20 20  lerArg          
23680 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
23690 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75  t to pass to xBu
236a0 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a  syHandler */.){.
236b0 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
236c0 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
236d0 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
236e0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
236f0 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
23700 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f 70 65  rg;..  if( isOpe
23710 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
23720 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d  .    void **ap =
23730 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65   (void **)&pPage
23740 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b  r->xBusyHandler;
23750 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69  .    assert( ((i
23760 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61  nt(*)(void *))(a
23770 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e  p[0]))==xBusyHan
23780 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73 73 65  dler );.    asse
23790 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79  rt( ap[1]==pBusy
237a0 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a 20 20  HandlerArg );.  
237b0 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
237c0 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
237d0 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
237e0 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c  NTL_BUSYHANDLER,
237f0 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20   (void *)ap);.  
23800 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
23810 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
23820 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
23830 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
23840 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
23850 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
23860 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
23870 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
23880 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
23890 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
238a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
238b0 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
238c0 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
238d0 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
238e0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
238f0 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
23900 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
23910 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  , an SQLITE_IOER
23920 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65 20 6f  R_xxx sub-code o
23930 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a  r SQLITE_FULL)..
23940 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
23950 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
23960 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
23970 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  e:.**.**   * the
23980 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28   new page size (
23990 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53  value of *pPageS
239a0 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61  ize) is valid (a
239b0 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f   power .**     o
239c0 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31  f two between 51
239d0 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58  2 and SQLITE_MAX
239e0 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c  _PAGE_SIZE, incl
239f0 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a  usive), and.**.*
23a00 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20  *   * there are 
23a10 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  no outstanding p
23a20 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20  age references, 
23a30 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
23a40 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69  e database is ei
23a50 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d  ther not an in-m
23a60 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f  emory database o
23a70 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61  r it is.**     a
23a80 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
23a90 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e  base that curren
23aa0 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  tly consists of 
23ab0 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  zero pages..**.*
23ac0 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  * then the pager
23ad0 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a   object page siz
23ae0 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61  e is set to *pPa
23af0 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
23b00 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
23b10 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20  s changed, then 
23b20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73  this function us
23b30 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  es sqlite3PagerM
23b40 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f  alloc() .** to o
23b50 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65  btain a new Page
23b60 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
23b70 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f  er. If this allo
23b80 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a  cation attempt .
23b90 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
23ba0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
23bb0 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ed and the page 
23bc0 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63  size remains unc
23bd0 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61  hanged. .** In a
23be0 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20  ll other cases, 
23bf0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
23c00 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
23c10 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
23c20 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69   not changed, ei
23c30 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65  ther because one
23c40 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74   of the enumerat
23c50 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73  ed.** conditions
23c60 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72   above is not tr
23c70 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61  ue, the pager wa
23c80 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
23c90 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75   when this.** fu
23ca0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
23cb0 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  d, or because th
23cc0 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
23cd0 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ion attempt fail
23ce0 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50  ed, .** then *pP
23cf0 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74  ageSize is set t
23d00 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69  o the old, retai
23d10 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65  ned page size be
23d20 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
23d30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23d40 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
23d50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 33  ager *pPager, u3
23d60 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20 69 6e  2 *pPageSize, in
23d70 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
23d80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23d90 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  K;..  /* It is n
23da0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  ot possible to d
23db0 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72 74 5f  o a full assert_
23dc0 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 68 65  pager_state() he
23dd0 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20 2a 2a  re, as this.  **
23de0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
23df0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
23e00 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28 29 2c  hin PagerOpen(),
23e10 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 74   before the stat
23e20 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 50 61  e.  ** of the Pa
23e30 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 69 6e  ger object is in
23e40 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74  ternally consist
23e50 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ent..  **.  ** A
23e60 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
23e70 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
23e80 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
23e90 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
23ea0 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f  .  ** PAGER_ERRO
23eb0 52 20 73 74 61 74 65 2e 20 42 75 74 20 73 69 6e  R state. But sin
23ec0 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ce PAGER_ERROR s
23ed0 74 61 74 65 20 67 75 61 72 61 6e 74 65 65 73 20  tate guarantees 
23ee0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72 65 20  that.  ** there 
23ef0 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  is at least one 
23f00 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
23f10 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 69 73   reference, this
23f20 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
23f30 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68  s a no-op for th
23f40 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a  at case anyhow..
23f50 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61 67 65    */..  u32 page
23f60 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
23f70 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  e;.  assert( pag
23f80 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67  eSize==0 || (pag
23f90 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
23fa0 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
23fb0 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b  AX_PAGE_SIZE) );
23fc0 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
23fd0 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67  memDb==0 || pPag
23fe0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20  er->dbSize==0). 
23ff0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
24000 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
24010 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
24020 20 20 20 26 26 20 70 61 67 65 53 69 7a 65 20 26     && pageSize &
24030 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75 33 32  & pageSize!=(u32
24040 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
24050 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  e .  ){.    char
24060 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20   *pNew = NULL;  
24070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
24080 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a  w temp space */.
24090 20 20 20 20 69 36 34 20 6e 42 79 74 65 20 3d 20      i64 nByte = 
240a0 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67  0;..    if( pPag
240b0 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
240c0 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65 6e 28  _OPEN && isOpen(
240d0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
240e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
240f0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
24100 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b  er->fd, &nByte);
24110 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
24120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24130 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 63 68        pNew = (ch
24140 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
24150 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
24160 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
24170 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  w ) rc = SQLITE_
24180 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOMEM;.    }..  
24190 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
241a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
241b0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
241c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
241d0 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
241e0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
241f0 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
24200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
24210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24220 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
24230 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
24240 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
24250 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
24260 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
24270 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
24280 3d 20 28 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b  = (Pgno)((nByte+
24290 70 61 67 65 53 69 7a 65 2d 31 29 2f 70 61 67 65  pageSize-1)/page
242a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
242b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
242c0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65  pageSize;.    }e
242d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
242e0 65 33 50 61 67 65 46 72 65 65 28 70 4e 65 77 29  e3PageFree(pNew)
242f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
24300 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
24310 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
24320 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24330 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 65  K ){.    if( nRe
24340 73 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72  serve<0 ) nReser
24350 76 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  ve = pPager->nRe
24360 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
24370 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
24380 26 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20  & nReserve<1000 
24390 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
243a0 52 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e  Reserve = (i16)n
243b0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67  Reserve;.    pag
243c0 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
243d0 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 46  ger);.    pagerF
243e0 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
243f0 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
24400 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
24410 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
24420 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
24430 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
24440 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
24450 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
24460 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
24470 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
24480 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
24490 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
244a0 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
244b0 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
244c0 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
244d0 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
244e0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
244f0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
24500 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
24510 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
24520 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
24530 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
24540 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
24550 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
24560 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
24570 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
24580 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
24590 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
245a0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
245b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
245c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
245d0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
245e0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
245f0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
24600 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
24610 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
24620 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
24630 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
24640 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
24650 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
24660 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
24670 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
24680 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
24690 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
246a0 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
246b0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
246c0 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
246d0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
246e0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
246f0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
24700 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
24710 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
24720 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
24730 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
24740 67 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ge;.  }.  assert
24750 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24760 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20  !=PAGER_OPEN ); 
24770 20 20 20 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f       /* Called o
24780 6e 6c 79 20 62 79 20 4f 50 5f 4d 61 78 50 67 63  nly by OP_MaxPgc
24790 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nt */.  assert( 
247a0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d  pPager->mxPgno>=
247b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
247c0 3b 20 20 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e  ;  /* OP_MaxPgcn
247d0 74 20 65 6e 66 6f 72 63 65 73 20 74 68 69 73 20  t enforces this 
247e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  */.  return pPag
247f0 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
24800 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
24810 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
24820 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
24830 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
24840 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
24850 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
24860 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
24870 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
24880 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
24890 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
248a0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
248b0 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
248c0 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
248d0 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
248e0 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
248f0 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
24900 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
24910 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
24920 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
24930 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
24940 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24950 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
24960 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
24970 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
24980 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
24990 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
249a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
249b0 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
249c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
249d0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
249e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
249f0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
24a00 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
24a10 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
24a20 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
24a30 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24a40 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
24a50 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
24a60 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
24a70 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
24a80 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
24a90 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
24aa0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
24ab0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
24ac0 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
24ad0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
24ae0 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
24af0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
24b00 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
24b10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
24b20 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
24b30 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
24b40 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
24b50 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
24b60 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
24b70 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
24b80 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
24b90 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
24ba0 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
24bb0 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
24bc0 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
24bd0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
24be0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
24bf0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
24c00 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
24c10 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
24c20 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
24c30 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
24c40 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
24c50 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
24c60 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
24c70 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
24c80 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
24c90 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
24ca0 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
24cb0 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
24cc0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
24cd0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
24ce0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
24cf0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
24d00 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
24d10 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
24d20 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
24d30 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
24d40 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
24d50 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
24d60 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
24d70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
24d80 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
24d90 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
24da0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
24db0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
24dc0 65 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e );..  /* This 
24dd0 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
24de0 63 61 6c 6c 65 64 20 62 79 20 62 74 72 65 65 20  called by btree 
24df0 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
24e00 72 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20  r creating.  ** 
24e10 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
24e20 2e 20 20 54 68 65 72 65 20 68 61 73 20 6e 6f 74  .  There has not
24e30 20 62 65 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75   been an opportu
24e40 6e 69 74 79 20 74 6f 20 74 72 61 6e 73 69 74 69  nity to transiti
24e50 6f 6e 0a 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d  on.  ** to WAL m
24e60 6f 64 65 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  ode yet..  */.  
24e70 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
24e80 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
24e90 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
24ea0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
24eb0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
24ec0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
24ed0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
24ee0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
24ef0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
24f00 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
24f10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
24f20 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
24f30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
24f40 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
24f50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24f60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24f70 74 69 6f 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65  tion may only be
24f80 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
24f90 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
24fa0 69 73 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  is open on.** th
24fb0 65 20 70 61 67 65 72 2e 20 49 74 20 72 65 74 75  e pager. It retu
24fc0 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
24fd0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
24fe0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
24ff0 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  *.** However, if
25000 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
25010 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
25020 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
25030 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
25040 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
25050 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
25060 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25070 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
25080 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
25090 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 61 73  t *pnPage){.  as
250a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
250b0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
250c0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
250d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
250e0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
250f0 49 53 48 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61  ISHED );.  *pnPa
25100 67 65 20 3d 20 28 69 6e 74 29 70 50 61 67 65 72  ge = (int)pPager
25110 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a  ->dbSize;.}.../*
25120 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
25130 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
25140 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65   locktype on the
25150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
25160 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20  If.** a similar 
25170 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
25180 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
25190 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
251a0 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65  s a no-op.** (re
251b0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
251c0 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a  K immediately)..
251d0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
251e0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
251f0 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  in the lock usin
25200 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  g sqlite3OsLock(
25210 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68  ). Invoke .** th
25220 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
25230 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63  if the lock is c
25240 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
25250 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a  ilable. Repeat .
25260 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  ** until the bus
25270 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
25280 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ns false or unti
25290 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f  l the attempt to
252a0 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20   .** obtain the 
252b0 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a  lock succeeds..*
252c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
252d0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
252e0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
252f0 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20  de if we cannot 
25300 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f  obtain.** the lo
25310 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
25320 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63  is obtained succ
25330 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68  essfully, set th
25340 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a  e Pager.state .*
25350 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f  * variable to lo
25360 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72 65  cktype before re
25370 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
25380 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
25390 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
253a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
253b0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
253c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
253e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
253f0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
25400 74 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72  t this is either
25410 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73   a no-op (becaus
25420 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
25430 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c  lock is .  ** al
25440 72 65 61 64 79 20 68 65 6c 64 29 2c 20 6f 72 20  ready held), or 
25450 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73  one of the trans
25460 69 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20  itions that the 
25470 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a  busy-handler.  *
25480 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64  * may be invoked
25490 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69   during, accordi
254a0 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e  ng to the commen
254b0 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c  t above.  ** sql
254c0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
254d0 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a  handler()..  */.
254e0 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
254f0 72 2d 3e 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79  r->eLock>=lockty
25500 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  pe).       || (p
25510 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f  Pager->eLock==NO
25520 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70  _LOCK && locktyp
25530 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  e==SHARED_LOCK).
25540 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
25550 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  r->eLock==RESERV
25560 45 44 5f 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74  ED_LOCK && lockt
25570 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
25580 4f 43 4b 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20  OCK).  );..  do 
25590 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
255a0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 6c  LockDb(pPager, l
255b0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  ocktype);.  }whi
255c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
255d0 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
255e0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
255f0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
25600 41 72 67 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Arg) );.  return
25610 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75   rc;.}../*.** Fu
25620 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54 72 75  nction assertTru
25630 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
25640 70 50 61 67 65 72 29 20 63 68 65 63 6b 73 20 74  pPager) checks t
25650 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a  hat one of the .
25660 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
25670 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64 69 72  true for all dir
25680 74 79 20 70 61 67 65 73 20 63 75 72 72 65 6e 74  ty pages current
25690 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ly in the page-c
256a0 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ache:.**.**   a)
256b0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
256c0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
256d0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 73 69   equal to the si
256e0 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20  ze of the .**   
256f0 20 20 20 63 75 72 72 65 6e 74 20 64 61 74 61 62     current datab
25700 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20 70 61  ase image, in pa
25710 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20  ges, OR.**.**   
25720 62 29 20 69 66 20 74 68 65 20 70 61 67 65 20 63  b) if the page c
25730 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72 69 74  ontent were writ
25740 74 65 6e 20 61 74 20 74 68 69 73 20 74 69 6d 65  ten at this time
25750 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a  , it would not.*
25760 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65 73 73  *      be necess
25770 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
25780 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
25790 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75 62 2d   out to the sub-
257a0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
257b0 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
257c0 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52  y function subjR
257d0 65 71 75 69 72 65 73 50 61 67 65 28 29 29 2e 0a  equiresPage())..
257e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e  **.** If the con
257f0 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65 64 20  dition asserted 
25800 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
25810 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20   were not true, 
25820 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  and the.** dirty
25830 20 70 61 67 65 20 77 65 72 65 20 74 6f 20 62 65   page were to be
25840 20 64 69 73 63 61 72 64 65 64 20 66 72 6f 6d 20   discarded from 
25850 74 68 65 20 63 61 63 68 65 20 76 69 61 20 74 68  the cache via th
25860 65 20 70 61 67 65 72 53 74 72 65 73 73 28 29 0a  e pagerStress().
25870 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61 67 65  ** routine, page
25880 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c 64 20  rStress() would 
25890 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 63 75  not write the cu
258a0 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65  rrent page conte
258b0 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74  nt to.** the dat
258c0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 61  abase file. If a
258d0 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61 6e 73   savepoint trans
258e0 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c  action were roll
258f0 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a  ed back after.**
25900 20 74 68 69 73 20 68 61 70 70 65 6e 65 64 2c 20   this happened, 
25910 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68 61  the correct beha
25920 76 69 6f 72 20 77 6f 75 6c 64 20 62 65 20 74 6f  vior would be to
25930 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
25940 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20  rent.** content 
25950 6f 66 20 74 68 65 20 70 61 67 65 2e 20 48 6f 77  of the page. How
25960 65 76 65 72 2c 20 73 69 6e 63 65 20 74 68 69 73  ever, since this
25970 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
25980 70 72 65 73 65 6e 74 20 69 6e 20 65 69 74 68 65  present in eithe
25990 72 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  r.** the databas
259a0 65 20 66 69 6c 65 20 6f 72 20 74 68 65 20 70 6f  e file or the po
259b0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c  rtion of the rol
259c0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
259d0 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  d .** sub-journa
259e0 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  l rolled back th
259f0 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20  e content could 
25a00 6e 6f 74 20 62 65 20 72 65 73 74 6f 72 65 64 20  not be restored 
25a10 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  and the.** datab
25a20 61 73 65 20 69 6d 61 67 65 20 77 6f 75 6c 64 20  ase image would 
25a30 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
25a40 49 74 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  It is therefore 
25a50 66 6f 72 74 75 6e 61 74 65 20 74 68 61 74 20 0a  fortunate that .
25a60 2a 2a 20 74 68 69 73 20 63 69 72 63 75 6d 73 74  ** this circumst
25a70 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61 72 69 73  ance cannot aris
25a80 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e..*/.#if define
25a90 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
25aa0 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25ab0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25ac0 61 69 6e 74 43 62 28 50 67 48 64 72 20 2a 70 50  aintCb(PgHdr *pP
25ad0 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
25ae0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
25af0 49 52 54 59 20 29 3b 0a 20 20 61 73 73 65 72 74  IRTY );.  assert
25b00 28 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  ( !subjRequiresP
25b10 61 67 65 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  age(pPg) || pPg-
25b20 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67  >pgno<=pPg->pPag
25b30 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a  er->dbSize );.}.
25b40 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25b50 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
25b60 61 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  aint(Pager *pPag
25b70 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  er){.  sqlite3Pc
25b80 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
25b90 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
25ba0 2c 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  , assertTruncate
25bb0 43 6f 6e 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d  ConstraintCb);.}
25bc0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
25bd0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25be0 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
25bf0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
25c00 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
25c10 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
25c20 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
25c30 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
25c40 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
25c50 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
25c60 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
25c70 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
25c80 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
25c90 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
25ca0 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
25cb0 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
25cc0 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
25cd0 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
25ce0 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
25cf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
25d00 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
25d10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25d20 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69  s only called ri
25d30 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
25d40 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
25d50 69 6f 6e 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69  ion..** Once thi
25d60 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  s function has b
25d70 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
25d80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
25d90 20 65 69 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f   either be.** ro
25da0 6c 6c 65 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d  lled back or com
25db0 6d 69 74 74 65 64 2e 20 49 74 20 69 73 20 6e 6f  mitted. It is no
25dc0 74 20 73 61 66 65 20 74 6f 20 63 61 6c 6c 20 74  t safe to call t
25dd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
25de0 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75  .** then continu
25df0 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
25e00 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f   database..*/.vo
25e10 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
25e20 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
25e30 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
25e40 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
25e50 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
25e60 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
25e70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
25e80 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
25e90 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
25ea0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
25eb0 3d 20 6e 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41  = nPage;..  /* A
25ec0 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 20  t one point the 
25ed0 63 6f 64 65 20 68 65 72 65 20 63 61 6c 6c 65 64  code here called
25ee0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
25ef0 6f 6e 73 74 72 61 69 6e 74 28 29 20 74 6f 0a 20  onstraint() to. 
25f00 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
25f10 61 6c 6c 20 70 61 67 65 73 20 62 65 69 6e 67 20  all pages being 
25f20 74 72 75 6e 63 61 74 65 64 20 61 77 61 79 20 62  truncated away b
25f30 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
25f40 20 61 72 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e   are,.  ** if on
25f50 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
25f60 69 6e 74 73 20 61 72 65 20 6f 70 65 6e 2c 20 70  ints are open, p
25f70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 61  resent in the sa
25f80 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f  vepoint .  ** jo
25f90 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 74 68  urnal so that th
25fa0 65 79 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  ey can be restor
25fb0 65 64 20 69 66 20 74 68 65 20 73 61 76 65 70 6f  ed if the savepo
25fc0 69 6e 74 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20  int is rolled.  
25fd0 2a 2a 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ** back. This is
25fe0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73   no longer neces
25ff0 73 61 72 79 20 61 73 20 74 68 69 73 20 66 75 6e  sary as this fun
26000 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c  ction is now onl
26010 79 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69  y.  ** called ri
26020 67 68 74 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69  ght before commi
26030 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
26040 69 6f 6e 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68  ion. So although
26050 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
26060 20 6f 62 6a 65 63 74 20 6d 61 79 20 73 74 69 6c   object may stil
26070 6c 20 68 61 76 65 20 6f 70 65 6e 20 73 61 76 65  l have open save
26080 70 6f 69 6e 74 73 20 28 50 61 67 65 72 2e 6e 53  points (Pager.nS
26090 61 76 65 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20  avepoint!=0), . 
260a0 20 2a 2a 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   ** they cannot 
260b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
260c0 53 6f 20 74 68 65 20 61 73 73 65 72 74 54 72 75  So the assertTru
260d0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
260e0 29 20 63 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e  ) call.  ** is n
260f0 6f 20 6c 6f 6e 67 65 72 20 63 6f 72 72 65 63 74  o longer correct
26100 2e 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  . */.}.../*.** T
26110 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26120 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 61 74  called before at
26130 74 65 6d 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a  tempting a hot-j
26140 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
26150 20 49 74 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65   It.** syncs the
26160 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
26170 20 64 69 73 6b 2c 20 74 68 65 6e 20 73 65 74 73   disk, then sets
26180 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
26190 48 64 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69  Hdr to the.** si
261a0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
261b0 6c 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 74  l file so that t
261c0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
261d0 6b 28 29 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77  k() routine know
261e0 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e  s.** that the en
261f0 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tire journal fil
26200 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
26210 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67  d..**.** Syncing
26220 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74   a hot-journal t
26230 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 20 61 74  o disk before at
26240 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c  tempting to roll
26250 20 69 74 20 62 61 63 6b 20 65 6e 73 75 72 65 73   it back ensures
26260 20 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 70   .** that if a p
26270 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 6f 63 63  ower-failure occ
26280 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
26290 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 72 6f  ollback, the pro
262a0 63 65 73 73 20 74 68 61 74 0a 2a 2a 20 61 74 74  cess that.** att
262b0 65 6d 70 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66  empts rollback f
262c0 6f 6c 6c 6f 77 69 6e 67 20 73 79 73 74 65 6d 20  ollowing system 
262d0 72 65 63 6f 76 65 72 79 20 73 65 65 73 20 74 68  recovery sees th
262e0 65 20 73 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a  e same journal.*
262f0 2a 20 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 69  * content as thi
26300 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  s process..**.**
26310 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   If everything g
26320 6f 65 73 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20  oes as planned, 
26330 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
26340 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
26350 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20  , .** an SQLite 
26360 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
26370 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
26380 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  yncHotJournal(Pa
26390 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
263a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
263b0 4f 4b 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  OK;.  if( !pPage
263c0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
263d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
263e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
263f0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
26400 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MAL);.  }.  if( 
26410 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26420 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26430 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
26440 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
26450 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20  ->journalHdr);. 
26460 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26470 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20  }../*.** Obtain 
26480 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
26490 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   memory mapped p
264a0 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 70  age object for p
264b0 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e  age number pgno.
264c0 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a   .** The new obj
264d0 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74 68 65  ect will use the
264e0 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61 2c 20   pointer pData, 
264f0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 78 46  obtained from xF
26500 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75  etch()..** If su
26510 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
26520 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 74  pPage to point t
26530 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 72  o the new page r
26540 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20  eference.** and 
26550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26560 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
26570 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urn an SQLite er
26580 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73 65 74  ror code and set
26590 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f 20 7a  .** *ppPage to z
265a0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ero..**.** Page 
265b0 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74 61 69  references obtai
265c0 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ned by calling t
265d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
265e0 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65 64 0a  uld be released.
265f0 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20 70 61  ** by calling pa
26600 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
26610 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
26620 6e 74 20 70 61 67 65 72 41 63 71 75 69 72 65 4d  nt pagerAcquireM
26630 61 70 50 61 67 65 28 0a 20 20 50 61 67 65 72 20  apPage(.  Pager 
26640 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
26650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26660 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50  er object */.  P
26670 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26690 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  * Page number */
266a0 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  .  void *pData, 
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29 27 64     /* xFetch()'d
266d0 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 70   data for this p
266e0 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
266f0 2a 70 70 50 61 67 65 20 20 20 20 20 20 20 20 20  *ppPage         
26700 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26710 20 41 63 71 75 69 72 65 64 20 70 61 67 65 20 6f   Acquired page o
26720 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67  bject */.){.  Pg
26730 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26750 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 70   Memory mapped p
26760 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  age to return */
26770 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67 65 72  .  .  if( pPager
26780 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26790 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
267a0 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d   p = pPager->pMm
267b0 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 20 20  apFreelist;.    
267c0 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
267d0 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69 72 74  elist = p->pDirt
267e0 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79  y;.    p->pDirty
267f0 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74   = 0;.    memset
26800 28 70 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70  (p->pExtra, 0, p
26810 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
26820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
26830 50 61 67 65 20 3d 20 70 20 3d 20 28 50 67 48 64  Page = p = (PgHd
26840 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r *)sqlite3Mallo
26850 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 48  cZero(sizeof(PgH
26860 64 72 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  dr) + pPager->nE
26870 78 74 72 61 29 3b 0a 20 20 20 20 69 66 28 20 70  xtra);.    if( p
26880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
26890 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
268a0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
268b0 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
268c0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
268d0 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
268e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
268f0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74     }.    p->pExt
26900 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  ra = (void *)&p[
26910 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  1];.    p->flags
26920 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20   = PGHDR_MMAP;. 
26930 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
26940 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20      p->pPager = 
26950 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61  pPager;.  }..  a
26960 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61  ssert( p->pExtra
26970 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20  ==(void *)&p[1] 
26980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
26990 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73  pPage==0 );.  as
269a0 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d  sert( p->flags==
269b0 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20  PGHDR_MMAP );.  
269c0 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
269d0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
269e0 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d  ssert( p->nRef==
269f0 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20  1 );..  p->pgno 
26a00 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61  = pgno;.  p->pDa
26a10 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50  ta = pData;.  pP
26a20 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b  ager->nMmapOut++
26a30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
26a40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26a50 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
26a60 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e  nce to page pPg.
26a70 20 70 50 67 20 6d 75 73 74 20 68 61 76 65 20 62   pPg must have b
26a80 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20  een returned by 
26a90 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63  an .** earlier c
26aa0 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75  all to pagerAcqu
26ab0 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  ireMapPage()..*/
26ac0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
26ad0 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65  erReleaseMapPage
26ae0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
26af0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
26b00 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70  pPg->pPager;.  p
26b10 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d  Pager->nMmapOut-
26b20 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79  -;.  pPg->pDirty
26b30 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70   = pPager->pMmap
26b40 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67  Freelist;.  pPag
26b50 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
26b60 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65  t = pPg;..  asse
26b70 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  rt( pPager->fd->
26b80 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69  pMethods->iVersi
26b90 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74  on>=3 );.  sqlit
26ba0 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
26bb0 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50  er->fd, (i64)(pP
26bc0 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  g->pgno-1)*pPage
26bd0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67  r->pageSize, pPg
26be0 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pData);.}../*.
26bf0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64  ** Free all PgHd
26c00 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64  r objects stored
26c10 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d   in the Pager.pM
26c20 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74  mapFreelist list
26c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26c40 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
26c50 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
26c60 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20  {.  PgHdr *p;.  
26c70 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20  PgHdr *pNext;.  
26c80 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d  for(p=pPager->pM
26c90 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20  mapFreelist; p; 
26ca0 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
26cb0 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  ext = p->pDirty;
26cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26cd0 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  e(p);.  }.}.../*
26ce0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
26cf0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
26d00 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
26d10 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
26d20 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
26d30 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
26d40 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
26d50 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
26d60 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
26d70 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
26d80 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
26d90 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
26da0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
26db0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
26dc0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
26dd0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
26de0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
26df0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
26e00 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
26e10 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
26e20 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
26e30 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
26e40 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
26e50 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26e60 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
26e70 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
26e80 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
26e90 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
26ea0 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
26eb0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
26ec0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
26ed0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
26ee0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
26ef0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
26f00 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
26f10 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
26f20 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
26f30 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
26f40 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
26f50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26f60 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75  .  u8 *pTmp = (u
26f70 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  8 *)pPager->pTmp
26f80 53 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74  Space;..  assert
26f90 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
26fa0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
26fb0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
26fc0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
26fd0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
26fe0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
26ff0 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64 72   pagerFreeMapHdr
27000 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20  s(pPager);.  /* 
27010 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
27020 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
27030 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
27040 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
27050 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73  ITE_OMIT_WAL.  s
27060 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70  qlite3WalClose(p
27070 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61  Pager->pWal, pPa
27080 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
27090 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
270a0 53 69 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70  Size, pTmp);.  p
270b0 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
270c0 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f  .#endif.  pager_
270d0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
270e0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
270f0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
27100 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
27110 0a 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73  .    /* If it is
27120 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20   open, sync the 
27130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
27140 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f  ore calling Unlo
27150 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20  ckAndRollback.. 
27160 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
27170 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20   not done, then 
27180 61 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  an unsynced port
27190 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ion of the open 
271a0 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
271b0 66 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79  file may be play
271c0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
271d0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
271e0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
271f0 63 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69  curs .    ** whi
27200 6c 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65  le this is happe
27210 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61  ning, the databa
27220 73 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20  se could become 
27230 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a  corrupt..    **.
27240 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72      ** If an err
27250 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
27260 74 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74  trying to sync t
27270 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66  he journal, shif
27280 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
27290 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ** into the ERRO
272a0 52 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61  R state. This ca
272b0 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f  uses UnlockAndRo
272c0 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b  llback to unlock
272d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
272e0 62 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  base and close t
272f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27300 77 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69  without attempti
27310 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20  ng to roll it.  
27320 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e    ** back or fin
27330 61 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65  alize it. The ne
27340 78 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72  xt database user
27350 20 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f   will have to do
27360 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot-journal.   
27370 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66   ** rollback bef
27380 6f 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  ore accessing th
27390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
273a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
273b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
273c0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  fd) ){.      pag
273d0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
273e0 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
273f0 72 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20  rnal(pPager));. 
27400 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
27410 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
27420 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
27430 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
27440 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
27450 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
27460 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
27470 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
27480 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
27490 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
274a0 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
274b0 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
274c0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
274d0 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74  r->jfd);.  sqlit
274e0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
274f0 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ->fd);.  sqlite3
27500 50 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a  PageFree(pTmp);.
27510 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
27520 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
27530 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53  ache);..#ifdef S
27540 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
27550 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
27560 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65  odecFree ) pPage
27570 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50  r->xCodecFree(pP
27580 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23  ager->pCodec);.#
27590 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
275a0 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   !pPager->aSavep
275b0 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  oint && !pPager-
275c0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
275d0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
275e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
275f0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
27600 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c  >sjfd) );..  sql
27610 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
27620 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
27630 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
27640 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
27650 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
27660 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
27670 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
27680 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67  ber for page pPg
27690 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
276a0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
276b0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
276c0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e   return pPg->pgn
276d0 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
276e0 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  ** Increment the
276f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
27700 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
27710 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
27720 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
27730 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
27740 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a  acheRef(pPg);.}.
27750 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
27760 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65  journal. In othe
27770 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
27780 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
27790 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
277a0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
277b0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
277c0 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
277d0 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
277e0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63  he.** disk and c
277f0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
27800 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
27810 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
27820 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
27830 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
27840 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
27850 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
27860 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
27870 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61  Otherwise, the a
27880 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20  ctions required 
27890 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f  depend on the jo
278a0 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74  urnal-mode and t
278b0 68 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68  he .** device ch
278c0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
278d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
278e0 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
278f0 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a  .**   * If the j
27900 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
27910 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
27920 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74  nal file, no act
27930 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20  ion need.**     
27940 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  be taken..**.** 
27950 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69    * Otherwise, i
27960 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
27970 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
27980 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  e SAFE_APPEND pr
27990 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74  operty,.**     t
279a0 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
279b0 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  ld of the most r
279c0 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20  ecently written 
279d0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
279e0 2a 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64  *     is updated
279f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
27a00 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61  number of journa
27a10 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68  l records that h
27a20 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20  ave.**     been 
27a30 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e  written followin
27a40 67 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67  g it. If the pag
27a50 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20  er is operating 
27a60 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20  in full-sync.** 
27a70 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74      mode, then t
27a80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27a90 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65  is synced before
27aa0 20 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75   this field is u
27ab0 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
27ac0 2a 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20  * If the device 
27ad0 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
27ae0 20 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20   the SEQUENTIAL 
27af0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a  property, then .
27b00 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66  **     journal f
27b10 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a  ile is synced..*
27b20 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75  *.** Or, in pseu
27b30 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  do-code:.**.**  
27b40 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d   if( NOT <in-mem
27b50 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a  ory journal> ){.
27b60 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
27b70 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a  AFE_APPEND ){.**
27b80 20 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c         if( <full
27b90 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53  -sync mode> ) xS
27ba0 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c  ync(<journal fil
27bb0 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75  e>);.**       <u
27bc0 70 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64  pdate nRec field
27bd0 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20  >.**     } .**  
27be0 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45     if( NOT SEQUE
27bf0 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a  NTIAL ) xSync(<j
27c00 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
27c10 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73  *   }.**.** If s
27c20 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
27c30 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
27c40 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
27c50 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
27c60 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
27c70 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
27c80 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
27c90 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
27ca0 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
27cb0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
27cc0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
27cd0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
27ce0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
27cf0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
27d00 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
27d10 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
27d20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72  newHdr){.  int r
27d30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27d50 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
27d60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27d70 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
27d80 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
27d90 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
27da0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
27db0 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a  ITER_DBMOD.  );.
27dc0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
27dd0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
27de0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
27df0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
27e00 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20  Pager) );..  rc 
27e10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
27e20 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67  clusiveLock(pPag
27e30 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
27e40 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
27e50 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50  n rc;..  if( !pP
27e60 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
27e70 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
27e80 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
27e90 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28  .    if( isOpen(
27ea0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
27eb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
27ec0 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
27ed0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
27ee0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
27ef0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
27f00 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
27f10 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
27f20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27f30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
27f40 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
27f50 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
27f60 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
27f70 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
27f80 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
27f90 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
27fa0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
27fb0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
27fc0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
27fd0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
27fe0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
27ff0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
28000 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
28010 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
28020 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
28030 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
28040 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
28050 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
28060 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
28070 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
28080 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
28090 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
280a0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
280b0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
280c0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
280d0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
280e0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
280f0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
28100 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
28110 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
28120 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
28130 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
28140 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
28150 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
28160 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
28170 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
28180 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
28190 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
281a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
281b0 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
281c0 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
281d0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
281e0 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
281f0 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
28200 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
28210 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
28220 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
28230 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
28240 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
28250 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
28260 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
28270 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
28280 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
28290 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
282a0 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
282b0 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
282c0 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
282d0 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
282e0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
282f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28300 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
28310 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
28320 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
28330 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
28340 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
28350 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
28360 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
28370 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
28380 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
28390 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
283a0 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
283b0 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
283c0 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
283d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
283e0 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
283f0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
28400 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
28410 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
28420 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
28430 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
28440 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
28450 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
28460 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
28470 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
28480 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
28490 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
284a0 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
284b0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
284c0 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
284d0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
284e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
284f0 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
28500 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
28510 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
28520 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
28530 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
28540 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
28550 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
28560 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
28570 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
28580 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
28590 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
285a0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
285b0 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
285c0 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
285d0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
285e0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
285f0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
28600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28610 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
28620 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
28630 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
28640 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
28650 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
28660 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
28670 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
28680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
28690 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
286a0 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
286b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
286c0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
286d0 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
286e0 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
286f0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
28700 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28710 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
28720 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
28730 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
28740 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28750 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
28760 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
28770 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
28780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28790 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
287a0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
287b0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
287c0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
287d0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
287e0 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
287f0 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
28800 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
28810 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
28820 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
28830 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
28840 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
28850 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
28860 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28870 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
28880 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
28890 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
288a0 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
288b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
288c0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
288d0 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
288e0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
288f0 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
28900 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
28910 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
28920 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
28930 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
28940 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
28950 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
28960 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
28970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
28980 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
28990 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
289a0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
289b0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
289c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
289d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
289e0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
289f0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
28a00 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
28a10 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
28a20 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
28a30 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
28a40 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
28a50 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
28a60 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
28a70 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
28a80 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
28a90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28aa0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
28ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28ad0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
28ae0 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
28af0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
28b00 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
28b10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
28b20 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
28b30 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
28b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
28b50 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
28b60 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
28b70 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
28b80 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29  nalHdr.        )
28b90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28ba0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28bb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
28bc0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
28bd0 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
28be0 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
28bf0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28c00 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
28c10 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
28c20 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
28c30 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
28c40 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
28c50 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
28c60 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
28c70 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
28c80 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c  ager->syncFlags|
28c90 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
28ca0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d  ger->syncFlags==
28cb0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
28cc0 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54  ?SQLITE_SYNC_DAT
28cd0 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20  AONLY:0).       
28ce0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
28cf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28d00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28d10 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72   }..      pPager
28d20 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
28d30 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
28d40 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  f;.      if( new
28d50 48 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53  Hdr && 0==(iDc&S
28d60 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
28d70 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
28d80 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
28d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
28da0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
28db0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
28dc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28dd0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
28de0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
28df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
28e00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
28e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28e20 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
28e30 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20    /* Unless the 
28e40 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79  pager is in noSy
28e50 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75  nc mode, the jou
28e60 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
28e70 73 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  st .  ** success
28e80 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69  fully synced. Ei
28e90 74 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20  ther way, clear 
28ea0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
28eb0 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a  YNC flag on .  *
28ec0 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a  * all pages..  *
28ed0 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
28ee0 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
28ef0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
28f00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61  ;.  pPager->eSta
28f10 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
28f20 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72  R_DBMOD;.  asser
28f30 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
28f40 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
28f50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28f60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
28f70 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
28f80 65 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e  e first in a lin
28f90 6b 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74  ked list of dirt
28fa0 79 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  y pages connecte
28fb0 64 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64  d.** by the PgHd
28fc0 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
28fd0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
28fe0 77 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20  writes each one 
28ff0 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  of the.** in-mem
29000 6f 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ory pages in the
29010 20 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74   list to the dat
29020 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
29030 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20  argument may.** 
29040 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65  be NULL, represe
29050 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c  nting an empty l
29060 69 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ist. In this cas
29070 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
29080 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is.** a no-op..*
29090 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d  *.** The pager m
290a0 75 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73  ust hold at leas
290b0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
290c0 6b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  k when this func
290d0 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
290e0 64 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e  d. Before writin
290f0 67 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68  g anything to th
29100 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
29110 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73   this lock.** is
29120 20 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20   upgraded to an 
29130 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
29140 49 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  If the lock cann
29150 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a  ot be obtained,.
29160 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
29170 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  s returned and n
29180 6f 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  o data is writte
29190 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
291a0 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49  e file..** .** I
291b0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
291c0 20 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72   temp-file pager
291d0 20 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20   and the actual 
291e0 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65  file-system file
291f0 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  .** is not yet o
29200 70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74  pen, it is creat
29210 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65  ed and opened be
29220 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
29230 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74   .** written out
29240 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65  ..**.** Once the
29250 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75   lock has been u
29260 70 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20  pgraded and, if 
29270 6e 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66  necessary, the f
29280 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74  ile opened,.** t
29290 68 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69  he pages are wri
292a0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
292b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
292c0 20 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69   list order. Wri
292d0 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69  ting.** a page i
292e0 73 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20  s skipped if it 
292f0 6d 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20  meets either of 
29300 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
29310 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  iteria:.**.**   
29320 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
29330 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
29340 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
29350 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47  or.**   * The PG
29360 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
29370 6c 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68  lag is set on th
29380 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
29390 20 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70   writing out a p
293a0 61 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64  age causes the d
293b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
293c0 67 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69  grow, Pager.dbFi
293d0 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64  leSize.** is upd
293e0 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79  ated accordingly
293f0 2e 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77  . If page 1 is w
29400 72 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e  ritten out, then
29410 20 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65   the value cache
29420 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62  d.** in Pager.db
29430 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70  FileVers[] is up
29440 64 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74  dated to match t
29450 68 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f  he new value sto
29460 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61  red in.** the da
29470 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
29480 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
29490 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
294a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
294b0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
294c0 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
294d0 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
294e0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
294f0 4f 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55  Or, if the EXCLU
29500 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  SIVE lock cannot
29510 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  .** be obtained,
29520 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
29530 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
29540 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
29550 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67  ite_pagelist(Pag
29560 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
29570 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  r *pList){.  int
29580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
295b0 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
295c0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
295d0 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62  called for rollb
295e0 61 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52  ack pagers in WR
295f0 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65  ITER_DBMOD state
29600 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  . */.  assert( !
29610 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
29620 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
29630 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
29640 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
29650 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MOD );.  assert(
29660 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
29670 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
29680 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
29690 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
296a0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
296b0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
296c0 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
296d0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
296e0 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
296f0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
29700 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
29710 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
29720 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
29730 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
29740 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
29750 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
29760 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
29770 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
29780 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
29790 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
297a0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
297b0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
297c0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
297d0 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
297e0 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  gs);.  }..  /* B
297f0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
29800 77 72 69 74 65 2c 20 67 69 76 65 20 74 68 65 20  write, give the 
29810 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20 77 68  VFS a hint of wh
29820 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a  at the final.  *
29830 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c  * file size will
29840 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65   be..  */.  asse
29850 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
29860 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
29870 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69 66 28  er->fd) );.  if(
29880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc==SQLITE_OK .
29890 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
298a0 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65 72 2d  HintSize<pPager-
298b0 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20 28 70  >dbSize.   && (p
298c0 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20  List->pDirty || 
298d0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67  pList->pgno>pPag
298e0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a  er->dbHintSize).
298f0 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
29900 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d 20  _int64 szFile = 
29910 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
29920 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   * (sqlite3_int6
29930 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  4)pPager->dbSize
29940 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
29950 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
29960 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
29970 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
29980 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20  T, &szFile);.   
29990 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
299a0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
299b0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Size;.  }..  whi
299c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
299d0 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
299e0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c    Pgno pgno = pL
299f0 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20  ist->pgno;..    
29a00 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
29a10 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
29a20 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
29a30 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
29a40 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
29a50 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
29a60 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
29a70 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
29a80 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
29a90 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
29aa0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
29ab0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
29ac0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
29ad0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
29ae0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
29af0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
29b00 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
29b10 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74   ** Also, do not
29b20 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70   write out any p
29b30 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65  age that has the
29b40 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
29b50 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65  E flag.    ** se
29b60 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65  t (set by sqlite
29b70 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
29b80 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ))..    */.    i
29b90 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
29ba0 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
29bb0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
29bc0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
29bd0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
29be0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
29bf0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
29c00 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ze;   /* Offset 
29c10 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 20 20  to write */.    
29c20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b 20 20    char *pData;  
29c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c50 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74   /* Data to writ
29c60 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20 20 20  e */    ..      
29c70 61 73 73 65 72 74 28 20 28 70 4c 69 73 74 2d 3e  assert( (pList->
29c80 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
29c90 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20  _SYNC)==0 );.   
29ca0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
29cb0 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
29cc0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
29cd0 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20  r(pList);..     
29ce0 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65 20 64   /* Encode the d
29cf0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20  atabase */.     
29d00 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
29d10 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 67  pList->pData, pg
29d20 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20 53 51  no, 6, return SQ
29d30 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
29d40 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
29d50 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
29d60 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
29d70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
29d80 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
29d90 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
29da0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
29db0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
29dc0 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
29dd0 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
29de0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
29df0 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
29e00 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
29e10 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
29e20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
29e30 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
29e40 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
29e50 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
29e60 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
29e70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
29e80 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
29e90 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
29ea0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
29eb0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
29ec0 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
29ed0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
29ee0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
29ef0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
29f00 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
29f10 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
29f20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
29f30 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
29f40 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
29f50 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
29f60 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20  TAT_WRITE]++;.. 
29f70 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
29f80 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
29f90 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
29fa0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
29fb0 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
29fc0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
29fd0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
29fe0 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
29ff0 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
2a000 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2a010 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
2a020 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
2a030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a040 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2a050 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
2a060 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
2a070 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
2a080 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
2a090 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
2a0a0 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
2a0b0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
2a0c0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2a0d0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
2a0e0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2a0f0 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
2a100 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2a110 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
2a120 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
2a130 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
2a140 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74  List);.    pList
2a150 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2a160 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2a170 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
2a180 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
2a190 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2a1a0 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
2a1b0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
2a1c0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
2a1d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2a1e0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2a1f0 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
2a200 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
2a210 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
2a220 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
2a230 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
2a240 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2a250 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2a260 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
2a270 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2a280 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
2a290 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
2a2a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2a2b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
2a2c0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a2d0 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
2a2e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2a2f0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2a300 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
2a310 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2a320 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
2a330 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
2a340 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2a350 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a360 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
2a370 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
2a380 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
2a390 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
2a3a0 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
2a3b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a3c0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
2a3d0 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
2a3e0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
2a3f0 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
2a400 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a  b-journal. .**.*
2a410 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2a420 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2a430 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2a440 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2a450 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2a460 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2a470 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2a480 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2a490 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2a4a0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2a4b0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2a4c0 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2a4d0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2a4e0 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2a4f0 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2a500 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2a510 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2a520 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2a530 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2a540 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2a550 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2a560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2a570 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2a580 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2a590 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a5a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a5b0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a5c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2a5d0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2a5e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2a5f0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2a600 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2a610 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2a620 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2a630 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2a640 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2a650 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2a660 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2a670 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2a680 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2a690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2a6a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2a6b0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2a6c0 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2a6d0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2a6e0 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2a6f0 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2a700 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2a710 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2a720 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2a730 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2a740 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2a750 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2a760 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2a770 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2a780 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2a790 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2a7a0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2a7b0 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2a7c0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2a7d0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2a7e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2a7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a800 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2a810 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2a820 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2a830 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2a840 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2a850 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2a860 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2a870 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
2a880 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2a890 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2a8a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a8b0 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2a8c0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2a8d0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
2a8e0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
2a8f0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
2a900 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63  pgno));.      rc
2a910 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2a920 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
2a930 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
2a940 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2a950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a960 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a970 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
2a980 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  sjfd, pData2, pP
2a990 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2a9a0 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20  offset+4);.     
2a9b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2a9c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a9d0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2a9e0 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61  nSubRec++;.    a
2a9f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2aa00 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20  Savepoint>0 );. 
2aa10 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76     rc = addToSav
2aa20 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
2aa30 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
2aa40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2aa50 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  c;.}.static int 
2aa60 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
2aa70 52 65 71 75 69 72 65 64 28 50 67 48 64 72 20 2a  Required(PgHdr *
2aa80 70 50 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a  pPg){.  if( subj
2aa90 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2aaa0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2aab0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
2aac0 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Pg);.  }else{.  
2aad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aae0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
2aaf0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2ab00 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
2ab10 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
2ab20 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
2ab30 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
2ab40 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
2ab50 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2ab60 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
2ab70 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
2ab80 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
2ab90 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
2aba0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
2abb0 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
2abc0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
2abd0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
2abe0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
2abf0 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
2ac00 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
2ac10 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
2ac20 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
2ac30 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
2ac40 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
2ac50 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
2ac60 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
2ac70 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
2ac80 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
2ac90 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
2aca0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
2acb0 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
2acc0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
2acd0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
2ace0 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
2acf0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ad00 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
2ad10 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
2ad20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
2ad30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
2ad40 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2ad50 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
2ad60 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
2ad70 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
2ad80 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
2ad90 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
2ada0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
2adb0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
2adc0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
2add0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
2ade0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2adf0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
2ae00 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
2ae10 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
2ae20 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
2ae30 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
2ae40 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
2ae50 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
2ae60 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
2ae70 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
2ae80 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
2ae90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2aea0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
2aeb0 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
2aec0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2aed0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
2aee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2aef0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
2af00 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
2af10 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
2af20 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
2af30 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
2af40 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c  /* The doNotSpil
2af50 6c 20 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20  l NOSYNC bit is 
2af60 73 65 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73  set during times
2af70 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79   when doing a sy
2af80 6e 63 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e  nc of.  ** journ
2af90 61 6c 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61  al (and adding a
2afa0 20 6e 65 77 20 68 65 61 64 65 72 29 20 69 73 20   new header) is 
2afb0 6e 6f 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68  not allowed.  Th
2afc0 69 73 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  is occurs.  ** d
2afd0 75 72 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73  uring calls to s
2afe0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2aff0 28 29 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  () while trying 
2b000 74 6f 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69  to journal multi
2b010 70 6c 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62  ple.  ** pages b
2b020 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
2b030 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a  same sector..  *
2b040 2a 0a 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74  *.  ** The doNot
2b050 53 70 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61  Spill ROLLBACK a
2b060 6e 64 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69  nd OFF bits inhi
2b070 62 69 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73  bits all cache s
2b080 70 69 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67  pilling.  ** reg
2b090 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
2b0a0 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63  er or not a sync
2b0b0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 54   is required.  T
2b0c0 68 69 73 20 69 73 20 73 65 74 20 64 75 72 69 6e  his is set durin
2b0d0 67 0a 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63  g.  ** a rollbac
2b0e0 6b 20 6f 72 20 62 79 20 75 73 65 72 20 72 65 71  k or by user req
2b0f0 75 65 73 74 2c 20 72 65 73 70 65 63 74 69 76 65  uest, respective
2b100 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ly..  **.  ** Sp
2b110 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2b120 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2b130 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2b140 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2b150 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2b160 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2b170 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2b180 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2b190 69 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20  ion it .  ** is 
2b1a0 69 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73  impossible for s
2b1b0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
2b1c0 68 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  h() to be called
2b1d0 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67   with createFlag
2b1e0 3d 3d 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69  ==3.  ** while i
2b1f0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2b200 65 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69  e, hence it is i
2b210 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68  mpossible for th
2b220 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20  is routine to.  
2b230 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20  ** be called in 
2b240 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2b250 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
2b260 77 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56  we include a NEV
2b270 45 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66  ER().  ** test f
2b280 6f 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  or the error sta
2b290 74 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72  te as a safeguar
2b2a0 64 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65  d against future
2b2b0 20 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20   changes..  */. 
2b2c0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2b2d0 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
2b2e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b2f0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2b300 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b310 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
2b320 41 43 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ACK );.  testcas
2b330 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2b340 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2b350 47 5f 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63  G_OFF );.  testc
2b360 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2b370 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2b380 4c 41 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20  LAG_NOSYNC );.  
2b390 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  if( pPager->doNo
2b3a0 74 53 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70  tSpill.   && ((p
2b3b0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2b3c0 6c 20 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52  l & (SPILLFLAG_R
2b3d0 4f 4c 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41  OLLBACK|SPILLFLA
2b3e0 47 5f 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20  G_OFF))!=0.     
2b3f0 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20   || (pPg->flags 
2b400 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
2b410 43 29 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  C)!=0).  ){.    
2b420 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b430 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44  ;.  }..  pPg->pD
2b440 69 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  irty = 0;.  if( 
2b450 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
2b460 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72  er) ){.    /* Wr
2b470 69 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ite a single fra
2b480 6d 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  me for this page
2b490 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a   to the log. */.
2b4a0 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
2b4b0 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2b4c0 64 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28  d(pPg); .    if(
2b4d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b4e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
2b4f0 65 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  erWalFrames(pPag
2b500 65 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a  er, pPg, 0, 0);.
2b510 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2b520 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2b530 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2b540 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2b550 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2b560 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2b570 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2b580 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2b590 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2b5a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2b5b0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2b5c0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2b5d0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2b5e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2b5f0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2b600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b610 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2b620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2b630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2b640 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2b650 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2b660 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2b670 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2b680 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2b690 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2b6a0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2b6b0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2b6c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b6d0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2b6e0 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2b6f0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2b700 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2b710 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2b720 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2b730 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2b740 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2b750 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2b760 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2b770 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2b780 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2b790 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2b7a0 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2b7b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2b7c0 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2b7d0 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2b7e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2b7f0 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2b800 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2b810 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2b820 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2b830 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2b840 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2b850 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2b860 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2b870 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2b880 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2b890 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2b8a0 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2b8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b8c0 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2b8d0 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2b8e0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2b8f0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2b900 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2b910 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b920 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2b930 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2b940 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2b950 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2b960 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2b970 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2b980 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2b990 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2b9a0 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2b9b0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2b9c0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2b9d0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2b9e0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2b9f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ba00 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2ba10 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2ba20 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2ba30 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2ba40 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2ba50 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2ba60 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2ba70 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2ba80 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2ba90 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2baa0 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2bab0 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2bac0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2bad0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2bae0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2baf0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2bb00 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2bb10 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2bb20 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2bb30 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2bb40 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2bb50 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2bb60 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2bb70 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2bb80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2bb90 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2bba0 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2bbb0 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2bbc0 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2bbd0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2bbe0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2bbf0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2bc00 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2bc10 50 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c  PI..**.** The fl
2bc20 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ags argument is 
2bc30 75 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20  used to specify 
2bc40 70 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20  properties that 
2bc50 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70  affect the.** op
2bc60 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  eration of the p
2bc70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20  ager. It should 
2bc80 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62  be passed some b
2bc90 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69  itwise combinati
2bca0 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47  on.** of the PAG
2bcb0 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  ER_* flags..**.*
2bcc0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
2bcd0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
2bce0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
2bcf0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
2bd00 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
2bd10 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
2bd20 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
2bd30 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
2bd40 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
2bd50 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
2bd60 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
2bd70 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
2bd80 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
2bd90 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
2bda0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2bdb0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
2bdc0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2bdd0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
2bde0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
2bdf0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
2be00 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
2be10 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
2be20 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
2be30 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2be40 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
2be50 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
2be60 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
2be70 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
2be80 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
2be90 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
2bea0 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
2beb0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
2bec0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2bed0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
2bee0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2bef0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
2bf00 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
2bf10 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
2bf20 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
2bf30 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
2bf40 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
2bf50 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
2bf60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2bf70 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
2bf80 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2bf90 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
2bfa0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
2bfb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
2bfc0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
2bfd0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2bfe0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2bff0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2c000 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
2c010 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
2c020 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
2c030 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  sFlags,         
2c040 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
2c050 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
2c060 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
2c070 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52  ) */.  void (*xR
2c080 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20  einit)(DbPage*) 
2c090 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72  /* Function to r
2c0a0 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65  einitialize page
2c0b0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  s */.){.  u8 *pP
2c0c0 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
2c0d0 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
2c0e0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
2c0f0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
2c100 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
2c110 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2c120 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2c130 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
2c140 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
2c150 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
2c160 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
2c170 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
2c180 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
2c190 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2c1a0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c1b0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
2c1c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
2c1d0 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
2c1e0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c1f0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
2c200 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
2c210 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
2c220 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
2c230 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
2c240 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
2c250 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
2c260 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
2c270 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
2c280 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2c290 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
2c2a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c2b0 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
2c2c0 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
2c2d0 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
2c2e0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
2c2f0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
2c300 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
2c310 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 70  urnal */.  int p
2c320 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69  cacheSize = sqli
2c330 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b  te3PcacheSize();
2c340 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2c350 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2c360 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33 32 20  PCache */.  u32 
2c370 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2c380 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2c390 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75  _SIZE;  /* Defau
2c3a0 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  lt page size */.
2c3b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
2c3c0 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 52  ri = 0;    /* UR
2c3d0 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79 20 2a  I args to copy *
2c3e0 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 30  /.  int nUri = 0
2c3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c400 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2c410 6f 66 20 55 52 49 20 61 72 67 73 20 61 74 20 2a  of URI args at *
2c420 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  zUri */..  /* Fi
2c430 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
2c440 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
2c450 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
2c460 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
2c470 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
2c480 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
2c490 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
2c4a0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
2c4b0 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
2c4c0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
2c4d0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
2c4e0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2c4f0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
2c500 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
2c510 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
2c520 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
2c530 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
2c540 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
2c550 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
2c560 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
2c570 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
2c580 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
2c590 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
2c5a0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
2c5b0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
2c5c0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2c5d0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
2c5e0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
2c5f0 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
2c600 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
2c610 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
2c620 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
2c630 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
2c640 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2c650 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2c660 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2c670 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c680 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c690 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2c6a0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
2c6b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
2c6c0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2c6d0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2c6e0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2c6f0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2c700 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2c710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2c720 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2c730 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2c740 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2c750 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   1;.    if( zFil
2c760 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c770 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  me[0] ){.      z
2c780 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c790 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46  e3DbStrDup(0, zF
2c7a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2c7b0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2c7c0 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54    ) return SQLIT
2c7d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 6e  E_NOMEM;.      n
2c7e0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c7f0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2c800 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69  name);.      zFi
2c810 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  lename = 0;.    
2c820 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
2c830 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
2c840 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
2c850 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
2c860 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
2c870 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
2c880 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
2c890 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
2c8a0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
2c8b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
2c8c0 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
2c8d0 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
2c8e0 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
2c8f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2c900 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2c910 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e  me[0] ){.    con
2c920 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
2c930 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
2c940 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2c950 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
2c960 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
2c970 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a  aw(0, nPathname*
2c980 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  2);.    if( zPat
2c990 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  hname==0 ){.    
2c9a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c9b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
2c9c0 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
2c9d0 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
2c9e0 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
2c9f0 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
2ca00 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
2ca10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
2ca20 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
2ca30 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
2ca40 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
2ca50 29 3b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  );.    nPathname
2ca60 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2ca70 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  30(zPathname);. 
2ca80 20 20 20 7a 20 3d 20 7a 55 72 69 20 3d 20 26 7a     z = zUri = &z
2ca90 46 69 6c 65 6e 61 6d 65 5b 73 71 6c 69 74 65 33  Filename[sqlite3
2caa0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
2cab0 6d 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  me)+1];.    whil
2cac0 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 7a  e( *z ){.      z
2cad0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
2cae0 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 20 20  n30(z)+1;.      
2caf0 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  z += sqlite3Strl
2cb00 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20 20 20 7d  en30(z)+1;.    }
2cb10 0a 20 20 20 20 6e 55 72 69 20 3d 20 28 69 6e 74  .    nUri = (int
2cb20 29 28 26 7a 5b 31 5d 20 2d 20 7a 55 72 69 29 3b  )(&z[1] - zUri);
2cb30 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 55 72  .    assert( nUr
2cb40 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i>=0 );.    if( 
2cb50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2cb60 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
2cb70 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
2cb80 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
2cb90 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
2cba0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2cbb0 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
2cbc0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
2cbd0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
2cbe0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
2cbf0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
2cc00 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
2cc10 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
2cc20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
2cc30 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
2cc40 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
2cc50 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
2cc60 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
2cc70 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
2cc80 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
2cc90 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
2cca0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
2ccb0 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
2ccc0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ccd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
2cce0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
2ccf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2cd00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2cd10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
2cd20 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2cd30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2cd40 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
2cd50 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
2cd60 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  r the Pager stru
2cd70 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f 62  cture, PCache ob
2cd80 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20 74  ject, the.  ** t
2cd90 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72 69  hree file descri
2cda0 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61 62  ptors, the datab
2cdb0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e  ase file name an
2cdc0 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  d the journal . 
2cdd0 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20 54   ** file name. T
2cde0 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65 6d  he layout in mem
2cdf0 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  ory is as follow
2ce00 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
2ce10 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20 20   Pager object   
2ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce30 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29 20   (sizeof(Pager) 
2ce40 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2ce50 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20 20  PCache object   
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce70 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69  (sqlite3PcacheSi
2ce80 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ze() bytes).  **
2ce90 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69       Database fi
2cea0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2ceb0 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f 73       (pVfs->szOs
2cec0 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a 2a  File bytes).  **
2ced0 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61 6c       Sub-journal
2cee0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
2cef0 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69 6c       (journalFil
2cf00 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20 2a  eSize bytes).  *
2cf10 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72 6e  *     Main journ
2cf20 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
2cf30 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
2cf40 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
2cf50 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
2cf60 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2cf70 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
2cf80 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  e+1 bytes).  ** 
2cf90 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
2cfa0 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20   name           
2cfb0 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 38      (nPathname+8
2cfc0 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a 20  +1 bytes).  */. 
2cfd0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73 71   pPtr = (u8 *)sq
2cfe0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2cff0 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65  .    ROUND8(size
2d000 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b 20 20  of(*pPager)) +  
2d010 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72      /* Pager str
2d020 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 52 4f  ucture */.    RO
2d030 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29  UND8(pcacheSize)
2d040 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
2d050 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
2d060 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56 66 73  .    ROUND8(pVfs
2d070 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20 20 20  ->szOsFile) +   
2d080 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2d090 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
2d0a0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
2d0b0 20 32 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a   2 +          /*
2d0c0 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
2d0d0 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e   files */ .    n
2d0e0 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 6e  Pathname + 1 + n
2d0f0 55 72 69 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  Uri +         /*
2d100 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20   zFilename */.  
2d110 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 38 20    nPathname + 8 
2d120 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20  + 2             
2d130 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a   /* zJournal */.
2d140 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2d150 4d 49 54 5f 57 41 4c 0a 20 20 20 20 2b 20 6e 50  MIT_WAL.    + nP
2d160 61 74 68 6e 61 6d 65 20 2b 20 34 20 2b 20 32 20  athname + 4 + 2 
2d170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 57             /* zW
2d180 61 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 29  al */.#endif.  )
2d190 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d1a0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d1b0 28 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  (SQLITE_INT_TO_P
2d1c0 54 52 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  TR(journalFileSi
2d1d0 7a 65 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70  ze)) );.  if( !p
2d1e0 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Ptr ){.    sqlit
2d1f0 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2d200 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
2d210 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d220 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20  .  }.  pPager = 
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61               (Pa
2d240 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70  ger*)(pPtr);.  p
2d250 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
2d260 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50      (PCache*)(pP
2d270 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  tr += ROUND8(siz
2d280 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a  eof(*pPager)));.
2d290 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
2d2a0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d2b0 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
2d2c0 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20  pcacheSize));.  
2d2d0 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28  pPager->sjfd = (
2d2e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70  sqlite3_file*)(p
2d2f0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56  Ptr += ROUND8(pV
2d300 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a  fs->szOsFile));.
2d310 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
2d320 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
2d330 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
2d340 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
2d350 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
2d360 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
2d370 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2d380 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
2d390 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2d3a0 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64  MENT(pPager->jfd
2d3b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  ) );..  /* Fill 
2d3c0 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69  in the Pager.zFi
2d3d0 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72  lename and Pager
2d3e0 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72  .zJournal buffer
2d3f0 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  s, if required. 
2d400 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
2d410 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  me ){.    assert
2d420 28 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b  ( nPathname>0 );
2d430 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  .    pPager->zJo
2d440 75 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a  urnal =   (char*
2d450 29 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e  )(pPtr += nPathn
2d460 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b  ame + 1 + nUri);
2d470 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d480 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
2d490 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2d4a0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55  ame);.    if( nU
2d4b0 72 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61  ri ) memcpy(&pPa
2d4c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
2d4d0 50 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72  Pathname+1], zUr
2d4e0 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65  i, nUri);.    me
2d4f0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
2d500 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65  urnal, zPathname
2d510 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
2d520 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
2d530 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68  ->zJournal[nPath
2d540 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  name], "-journal
2d550 5c 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20  \000", 8+2);.   
2d560 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2d570 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2d580 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2d590 4a 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65  Journal);.#ifnde
2d5a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2d5b0 4c 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57  L.    pPager->zW
2d5c0 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a  al = &pPager->zJ
2d5d0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2d5e0 2b 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  +8+1];.    memcp
2d5f0 79 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  y(pPager->zWal, 
2d600 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2d610 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2d620 79 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b  y(&pPager->zWal[
2d630 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61  nPathname], "-wa
2d640 6c 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20  l\000", 4+1);.  
2d650 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
2d660 66 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69  fix3(pPager->zFi
2d670 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
2d680 7a 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zWal);.#endif.  
2d690 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d6a0 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d6b0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
2d6c0 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
2d6d0 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
2d6e0 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
2d6f0 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
2d700 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
2d710 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2d720 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2d730 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
2d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d750 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
2d760 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
2d770 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
2d780 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2d790 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2d7a0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
2d7b0 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
2d7c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
2d7d0 6d 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61  memDb );.    rea
2d7e0 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
2d7f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2d800 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  LY);..    /* If 
2d810 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63  the file was suc
2d820 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64  cessfully opened
2d830 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2d840 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63  access,.    ** c
2d850 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20  hoose a default 
2d860 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73  page size in cas
2d870 65 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65  e we have to cre
2d880 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
2d890 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
2d8a0 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2d8b0 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d  ize is the maxim
2d8c0 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  um of:.    **.  
2d8d0 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45    **    + SQLITE
2d8e0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d8f0 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  ZE,.    **    + 
2d900 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
2d910 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ed by sqlite3OsS
2d920 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
2d930 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
2d940 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
2d950 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
2d960 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
2d970 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2d980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d990 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
2d9a0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
2d9b0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
2d9c0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
2d9d0 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b  if( !readOnly ){
2d9e0 0a 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74  .        setSect
2d9f0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
2da00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2da10 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2da20 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
2da30 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2da40 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20  _SIZE);.        
2da50 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70  if( szPageDflt<p
2da60 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2da70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
2da80 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
2da90 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  rSize>SQLITE_MAX
2daa0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dab0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
2dac0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
2dad0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2dae0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
2daf0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2db00 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
2db10 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67  Dflt = (u32)pPag
2db20 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
2db30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2db40 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
2db50 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2db60 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  C_WRITE.        
2db70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2db80 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ii;.          as
2db90 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2dba0 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
2dbb0 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  2>>8));.        
2dbc0 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2dbd0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d  IOCAP_ATOMIC64K=
2dbe0 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20  =(65536>>8));.  
2dbf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2dc00 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
2dc10 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
2dc20 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  36);.          f
2dc30 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74  or(ii=szPageDflt
2dc40 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  ; ii<=SQLITE_MAX
2dc50 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2dc60 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20  ZE; ii=ii*2){.  
2dc70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
2dc80 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
2dc90 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
2dca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2dcb0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
2dcc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2dcd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2dce0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2dcf0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2dd00 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69  r->noLock = sqli
2dd10 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
2dd20 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f  zFilename, "nolo
2dd30 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ck", 0);.      i
2dd40 66 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45  f( (iDc & SQLITE
2dd50 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45  _IOCAP_IMMUTABLE
2dd60 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73  )!=0.       || s
2dd70 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
2dd80 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69  an(zFilename, "i
2dd90 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b  mmutable", 0) ){
2dda0 0a 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c  .          vfsFl
2ddb0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
2ddc0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
2ddd0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f         goto act_
2dde0 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a  like_temp_file;.
2ddf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2de00 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2de10 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2de20 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2de30 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2de40 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2de50 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2de60 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2de70 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2de80 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2de90 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2dea0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2deb0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2dec0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2ded0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2dee0 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2def0 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2df00 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2df10 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2df20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2df30 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2df40 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2df50 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2df60 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2df70 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2df80 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2df90 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a   journal..    **
2dfa0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2dfb0 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f  nch also runs fo
2dfc0 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61  r files marked a
2dfd0 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20  s immutable..   
2dfe0 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65   */ .act_like_te
2dff0 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d  mp_file:.    tem
2e000 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
2e010 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
2e020 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20  PAGER_READER;   
2e030 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20    /* Pretend we 
2e040 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
2e050 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ock */.    pPage
2e060 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2e070 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a  SIVE_LOCK;    /*
2e080 20 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20   Pretend we are 
2e090 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64  in EXCLUSIVE mod
2e0a0 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  e */.    pPager-
2e0b0 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20  >noLock = 1;    
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2e0d0 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  o no locking */.
2e0e0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
2e0f0 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
2e100 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2e110 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
2e120 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20  llowing call to 
2e130 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
2e140 28 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74  () serves to set
2e150 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20   the value of . 
2e160 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   ** Pager.pageSi
2e170 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61  ze and to alloca
2e180 74 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d  te the Pager.pTm
2e190 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2e1a0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2e1b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
2e1c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
2e1d0 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72  emDb==0 );.    r
2e1e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e1f0 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
2e200 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c  er, &szPageDflt,
2e210 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
2e220 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
2e230 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  K );.  }..  /* I
2e240 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43  nitialize the PC
2e250 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a  ache object. */.
2e260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e270 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2e280 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30 20 29  t( nExtra<1000 )
2e290 3b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52  ;.    nExtra = R
2e2a0 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
2e2b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2e2c0 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
2e2d0 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
2e2e0 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
2e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
2e300 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
2e310 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
2e320 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
2e330 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  he);.  }..  /* I
2e340 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2e350 72 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20  red above, free 
2e360 74 68 65 20 20 50 61 67 65 72 20 73 74 72 75 63  the  Pager struc
2e370 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
2e380 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
2e390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e3a0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2e3b0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
2e3c0 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
2e3d0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
2e3e0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
2e3f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
2e400 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
2e410 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  n rc;.  }..  PAG
2e420 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  ERTRACE(("OPEN %
2e430 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
2e440 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64  DLEID(pPager->fd
2e450 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ), pPager->zFile
2e460 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43  name));.  IOTRAC
2e470 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e  E(("OPEN %p %s\n
2e480 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
2e490 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a  r->zFilename))..
2e4a0 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
2e4b0 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f  rnal = (u8)useJo
2e4c0 75 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67  urnal;.  /* pPag
2e4d0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
2e4e0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e4f0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
2e500 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e510 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
2e520 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
2e530 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
2e540 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
2e550 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2e560 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
2e570 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2e580 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
2e590 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
2e5a0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
2e5b0 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
2e5c0 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  K; */.  /* pPage
2e5d0 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
2e5e0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
2e5f0 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
2e600 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
2e610 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2e620 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2e630 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
2e640 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2e650 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2e660 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2e670 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2e680 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
2e690 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
2e6a0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2e6b0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
2e6c0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2e6d0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
2e6e0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2e6f0 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
2e700 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
2e710 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
2e720 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61  u8)readOnly;.  a
2e730 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
2e740 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
2e750 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
2e760 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
2e770 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2e780 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2e790 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
2e7a0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
2e7b0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2e7c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2e7d0 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2e7e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e7f0 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2e800 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e810 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2e820 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2e830 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2e840 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2e850 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2e860 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2e870 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
2e880 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2e890 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2e8a0 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53  C_NORMAL | WAL_S
2e8b0 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
2e8c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
2e8d0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
2e8e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2e8f0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2e900 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
2e910 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2e920 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
2e930 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e940 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
2e950 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
2e960 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
2e970 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2e980 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
2e990 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
2e9a0 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
2e9b0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2e9c0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
2e9d0 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
2e9e0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2e9f0 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
2ea00 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
2ea10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2ea20 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2ea30 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
2ea40 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
2ea50 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2ea60 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2ea70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2ea80 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
2ea90 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
2eaa0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2eab0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
2eac0 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
2ead0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
2eae0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
2eaf0 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2eb00 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2eb10 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2eb20 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  ); */.  /* pPage
2eb30 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49  r->szMmap = SQLI
2eb40 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
2eb50 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20  SIZE // will be 
2eb60 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a  set by btree.c *
2eb70 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
2eb80 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2eb90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2eba0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
2ebb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ebc0 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
2ebd0 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
2ebe0 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
2ebf0 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
2ec00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2ec10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2ec20 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f   still were it o
2ec30 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e  ught.** to be on
2ec40 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e   disk.  Return n
2ec50 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f  on-zero (SQLITE_
2ec60 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2ec70 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
2ec80 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f  rror.** code fro
2ec90 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  m sqlite3OsAcces
2eca0 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61  s()) if the data
2ecb0 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69  base has gone mi
2ecc0 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
2ecd0 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55   int databaseIsU
2ece0 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50  nmoved(Pager *pP
2ecf0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61  ager){.  int bHa
2ed00 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e  sMoved = 0;.  in
2ed10 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
2ed20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20  ger->tempFile ) 
2ed30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ed40 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2ed50 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75  dbSize==0 ) retu
2ed60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ed70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ed80 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61  zFilename && pPa
2ed90 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
2eda0 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ] );.  rc = sqli
2edb0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
2edc0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
2edd0 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
2ede0 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29  VED, &bHasMoved)
2edf0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ee00 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
2ee10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53     /* If the HAS
2ee20 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74  _MOVED file-cont
2ee30 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65  rol is unimpleme
2ee40 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  nted, assume tha
2ee50 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  t the file.    *
2ee60 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  * has not been m
2ee70 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74  oved.  That is t
2ee80 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65  he historical be
2ee90 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65  havior of SQLite
2eea0 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a  : prior to.    *
2eeb0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c  * version 3.8.3,
2eec0 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65   it never checke
2eed0 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  d */.    rc = SQ
2eee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2eef0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ef00 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20  OK && bHasMoved 
2ef10 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2ef20 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
2ef30 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VED;.  }.  retur
2ef40 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2ef50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2ef60 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
2ef70 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
2ef80 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
2ef90 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
2efa0 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
2efb0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
2efc0 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
2efd0 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
2efe0 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
2eff0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
2f000 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
2f010 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
2f020 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
2f030 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
2f040 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2f050 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
2f060 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
2f070 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2f080 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
2f090 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
2f0a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
2f0b0 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
2f0c0 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
2f0d0 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
2f0e0 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
2f0f0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
2f100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f110 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
2f120 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f130 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
2f140 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
2f150 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
2f160 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
2f170 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
2f180 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
2f190 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
2f1a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
2f1b0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
2f1c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2f1d0 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
2f1e0 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
2f1f0 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
2f200 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
2f210 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
2f220 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
2f230 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
2f240 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
2f250 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
2f260 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
2f270 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
2f280 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
2f290 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
2f2a0 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
2f2b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
2f2c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
2f2d0 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
2f2e0 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
2f2f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
2f300 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
2f310 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
2f320 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
2f330 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
2f340 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
2f350 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
2f360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2f370 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
2f380 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
2f390 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
2f3a0 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
2f3b0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
2f3c0 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
2f3d0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
2f3e0 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
2f3f0 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
2f400 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
2f410 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
2f420 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
2f430 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
2f440 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
2f450 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
2f460 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
2f470 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
2f480 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2f490 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
2f4a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2f4b0 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
2f4c0 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
2f4d0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
2f4e0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
2f4f0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
2f500 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
2f510 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
2f520 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
2f530 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
2f540 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
2f550 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
2f560 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
2f570 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
2f580 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
2f590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2f5a0 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
2f5b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
2f5c0 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
2f5d0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
2f5e0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
2f5f0 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
2f600 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2f610 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2f620 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73  de */.  int exis
2f630 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ts = 1;         
2f640 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2f650 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
2f660 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
2f670 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21  int jrnlOpen = !
2f680 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
2f690 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  jfd);..  assert(
2f6a0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2f6b0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
2f6c0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2f6d0 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
2f6e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2f6f0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a  =PAGER_OPEN );..
2f700 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70    assert( jrnlOp
2f710 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74  en==0 || ( sqlit
2f720 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
2f730 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
2f740 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c  ->jfd) &.    SQL
2f750 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
2f760 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a  TABLE_WHEN_OPEN.
2f770 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74    ));..  *pExist
2f780 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72  s = 0;.  if( !jr
2f790 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  nlOpen ){.    rc
2f7a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
2f7b0 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
2f7c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
2f7d0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
2f7e0 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20   &exists);.  }. 
2f7f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f800 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
2f810 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d      int locked =
2f820 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f830 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
2f840 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
2f850 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
2f860 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
2f870 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
2f880 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
2f890 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
2f8a0 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
2f8b0 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
2f8c0 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
2f8d0 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
2f8e0 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
2f8f0 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
2f900 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
2f910 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
2f920 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
2f930 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
2f940 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
2f950 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
2f960 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
2f970 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
2f980 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
2f990 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
2f9a0 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
2f9b0 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
2f9c0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
2f9d0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
2f9e0 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
2f9f0 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
2fa00 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
2fa10 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
2fa20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
2fa30 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
2fa40 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
2fa50 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
2fa60 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2fa70 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
2fa80 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
2fa90 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
2faa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2fab0 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
2fac0 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fae0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2faf0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
2fb00 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 72  file */..      r
2fb10 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
2fb20 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
2fb30 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2fb40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2fb50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
2fb60 20 64 61 74 61 62 61 73 65 20 69 73 20 7a 65 72   database is zer
2fb70 6f 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 2c  o pages in size,
2fb80 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
2fb90 20 65 69 74 68 65 72 20 28 31 29 20 74 68 65 0a   either (1) the.
2fba0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
2fbb0 61 6c 20 69 73 20 61 20 72 65 6d 6e 61 6e 74 20  al is a remnant 
2fbc0 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 64 61 74  from a prior dat
2fbd0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
2fbe0 61 6d 65 20 6e 61 6d 65 20 77 68 65 72 65 0a 20  ame name where. 
2fbf0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61         ** the da
2fc00 74 61 62 61 73 65 20 66 69 6c 65 20 62 75 74 20  tabase file but 
2fc10 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
2fc20 77 61 73 20 64 65 6c 65 74 65 64 2c 20 6f 72 20  was deleted, or 
2fc30 28 32 29 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  (2) the initial.
2fc40 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
2fc50 61 63 74 69 6f 6e 20 74 68 61 74 20 70 6f 70 75  action that popu
2fc60 6c 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61  lates a new data
2fc70 62 61 73 65 20 69 73 20 62 65 69 6e 67 20 72 6f  base is being ro
2fc80 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 20  lled back..     
2fc90 20 20 20 2a 2a 20 49 6e 20 65 69 74 68 65 72 20     ** In either 
2fca0 63 61 73 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  case, the journa
2fcb0 6c 20 66 69 6c 65 20 63 61 6e 20 62 65 20 64 65  l file can be de
2fcc0 6c 65 74 65 64 2e 20 20 48 6f 77 65 76 65 72 2c  leted.  However,
2fcd0 20 74 61 6b 65 20 63 61 72 65 0a 20 20 20 20 20   take care.     
2fce0 20 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 64 65 6c     ** not to del
2fcf0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
2fd00 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 61 6c  file if it is al
2fd10 72 65 61 64 79 20 6f 70 65 6e 20 64 75 65 20 74  ready open due t
2fd20 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  o.        ** jou
2fd30 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53  rnal_mode=PERSIS
2fd40 54 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  T..        */.  
2fd50 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
2fd60 3d 30 20 26 26 20 21 6a 72 6e 6c 4f 70 65 6e 20  =0 && !jrnlOpen 
2fd70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2fd80 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
2fd90 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
2fda0 20 20 20 69 66 28 20 70 61 67 65 72 4c 6f 63 6b     if( pagerLock
2fdb0 44 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52  Db(pPager, RESER
2fdc0 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51 4c 49 54  VED_LOCK)==SQLIT
2fdd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fde0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
2fdf0 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
2fe00 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2fe20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
2fe30 76 65 4d 6f 64 65 20 29 20 70 61 67 65 72 55 6e  veMode ) pagerUn
2fe40 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 53  lockDb(pPager, S
2fe50 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
2fe60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fe70 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
2fe80 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
2fe90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fea0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
2feb0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
2fec0 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
2fed0 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
2fee0 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
2fef0 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
2ff00 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2ff10 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
2ff20 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
2ff30 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
2ff40 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
2ff50 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
2ff60 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2ff70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
2ff80 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
2ff90 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
2ffa0 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
2ffb0 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
2ffc0 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
2ffd0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
2ffe0 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
2fff0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
30000 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
30010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
30020 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
30030 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
30040 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
30050 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
30060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
30070 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
30080 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
30090 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
300a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
300b0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
300c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
300d0 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74          u8 first
300e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
300f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
30100 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
30110 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74  , (void *)&first
30120 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
30130 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30140 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
30150 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
30160 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30170 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
30180 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30190 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
301a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
301b0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
301c0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
301d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
301e0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
301f0 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
30200 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
30210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
30220 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
30230 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
30240 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
30250 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
30260 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
30270 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
30280 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65    ** it has a ze
30290 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
302a0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
302b0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
302c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
302d0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
302e0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
302f0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
30300 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
30310 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
30320 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
30330 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
30340 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
30350 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
30360 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
30370 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
30380 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
30390 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
303a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
303b0 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
303c0 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
303d0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
303e0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
303f0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
30400 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
30410 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
30420 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
30430 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
30440 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
30450 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
30460 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
30470 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
30480 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
30490 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
304a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
304b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
304c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
304d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
304e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
304f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
30500 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
30510 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
30520 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
30530 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
30540 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
30550 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66  erGet() until af
30560 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
30570 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
30580 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
30590 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
305a0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
305b0 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
305c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
305d0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
305e0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
305f0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
30600 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
30610 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
30620 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
30630 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
30640 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
30650 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
30660 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
30670 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
30680 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
30690 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
306a0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
306b0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
306c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
306d0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
306e0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
306f0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
30700 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
30710 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30720 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
30730 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
30740 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
30750 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
30760 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
30770 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
30780 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
30790 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
307a0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
307b0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
307c0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
307d0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
307e0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
307f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30800 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
30810 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
30820 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
30830 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
30840 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
30850 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
30860 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
30870 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
30880 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
30890 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
308a0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
308b0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
308c0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
308d0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
308e0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
308f0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
30900 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
30910 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
30920 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
30930 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30940 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
30950 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
30960 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
30970 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
30980 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
30990 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
309a0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
309b0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
309c0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
309d0 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
309e0 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
309f0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
30a00 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
30a10 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
30a20 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
30a30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
30a40 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
30a50 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
30a60 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
30a70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
30a80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30aa0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
30ab0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
30ac0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
30ad0 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
30ae0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
30af0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
30b00 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
30b10 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
30b20 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
30b30 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
30b40 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
30b50 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
30b60 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
30b70 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
30b80 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
30b90 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
30ba0 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mode..  */.  ass
30bb0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
30bc0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
30bd0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
30be0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
30bf0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
30c00 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
30c10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
30c20 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
30c30 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
30c40 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
30c50 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45  ;.  if( NEVER(ME
30c60 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
30c70 72 72 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72  rrCode) ){ retur
30c80 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
30c90 65 3b 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67  e; }..  if( !pag
30ca0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
30cb0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
30cc0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
30cd0 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f  {.    int bHotJo
30ce0 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20  urnal = 1;      
30cf0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
30d00 68 65 72 65 20 65 78 69 73 74 73 20 61 20 68 6f  here exists a ho
30d10 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a  t journal-file *
30d20 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  /..    assert( !
30d30 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63  MEMDB );..    rc
30d40 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
30d50 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
30d60 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
30d70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30d80 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
30d90 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
30da0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
30db0 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
30dc0 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
30dd0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
30de0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
30df0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
30e00 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
30e10 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
30e20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
30e30 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
30e40 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
30e50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
30e60 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
30e70 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
30e80 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
30e90 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
30ea0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
30eb0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
30ec0 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
30ed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30ee0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30ef0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
30f00 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
30f10 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
30f20 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
30f30 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
30f40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30f50 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
30f60 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  BACK;.        go
30f70 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
30f80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74   }..      /* Get
30f90 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
30fa0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
30fb0 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
30fc0 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
30fd0 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
30fe0 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
30ff0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
31000 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
31010 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
31020 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
31030 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
31040 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
31050 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
31060 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
31070 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
31080 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
31090 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
310a0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
310b0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
310c0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
310d0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
310e0 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20   rolling the .  
310f0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
31100 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  al back..      *
31110 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  * .      ** Beca
31120 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
31130 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
31140 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
31150 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a  ted, any.      *
31160 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
31170 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63  attempting to ac
31180 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
31190 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20  e file will get 
311a0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  to .      ** thi
311b0 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
311c0 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20  ode and fail to 
311d0 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
311e0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20  XCLUSIVE lock . 
311f0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
31200 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
31210 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31220 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
31230 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d   is in locking_m
31240 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
31250 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a  de, the lock is.
31260 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61        ** downgra
31270 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f  ded to SHARED_LO
31280 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  CK before this f
31290 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
312a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
312b0 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
312c0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
312d0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
312e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
312f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
31300 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
31310 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  }. .      /* If 
31320 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
31330 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66  y open and the f
31340 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ile exists on di
31350 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20  sk, open the .  
31360 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
31370 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
31380 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65  cess. Write acce
31390 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ss is required b
313a0 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a  ecause .      **
313b0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
313c0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
313d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
313e0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
313f0 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f  .      ** and po
31400 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
31410 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
31420 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72  ter on. Also, wr
31430 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20  ite-access .    
31440 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20    ** is usually 
31450 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61  required to fina
31460 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
31470 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   in journal_mode
31480 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20  =persist .      
31490 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73  ** mode (and als
314a0 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  o for journal_mo
314b0 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73  de=truncate on s
314c0 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20  ome systems)..  
314d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
314e0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
314f0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
31500 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
31510 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
31520 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
31530 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
31540 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
31550 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
31560 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
31570 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
31580 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
31590 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
315a0 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  it .      ** may
315b0 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
315c0 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
315d0 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
315e0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
315f0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
31600 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
31610 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
31620 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
31630 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
31640 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
31650 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
31660 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
31670 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
31680 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  fs;.        int 
31690 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20  bExists;        
316a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
316b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
316c0 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ists */.        
316d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
316e0 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
316f0 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
31700 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
31710 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
31720 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20  &bExists);.     
31730 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31740 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
31750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
31760 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
31770 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
31780 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
31790 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
317a0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
317b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
317c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
317d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
317e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
317f0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
31800 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
31810 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
31820 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
31830 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
31840 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
31850 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
31860 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31870 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
31880 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
31890 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
318a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
318b0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
318c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
318d0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
318e0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
318f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
31900 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
31910 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
31920 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
31930 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
31940 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
31950 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
31960 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
31970 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
31980 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
31990 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
319a0 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
319b0 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
319c0 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
319d0 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
319e0 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
319f0 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
31a00 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
31a10 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
31a20 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
31a30 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
31a40 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
31a50 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
31a60 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
31a70 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
31a80 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
31a90 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
31aa0 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
31ab0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
31ac0 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
31ad0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
31ae0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
31af0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
31b00 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
31b10 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
31b20 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
31b30 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
31b40 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
31b50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31b60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31b70 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
31b80 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
31b90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
31ba0 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
31bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31bc0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
31bd0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
31be0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  de ){.        pa
31bf0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
31c00 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
31c10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31c20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31c30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
31c40 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
31c50 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f  taken if an erro
31c60 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
31c70 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20  rying to open.  
31c80 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c        ** or roll
31c90 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
31ca0 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  nal while holdin
31cb0 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
31cc0 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ock. The.       
31cd0 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   ** pager_unlock
31ce0 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
31cf0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
31d00 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e   returning to un
31d10 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  lock.        ** 
31d20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
31d30 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20   unlock attempt 
31d40 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65  fails, then Page
31d50 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a  r.eLock must be.
31d60 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
31d70 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28  o UNKNOWN_LOCK (
31d80 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
31d90 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
31da0 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  e for .        *
31db0 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61  * UNKNOWN_LOCK a
31dc0 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c  bove for an expl
31dd0 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20  anation). .     
31de0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
31df0 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   In order to get
31e00 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
31e10 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20  to do this, set 
31e20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a  Pager.eState to.
31e30 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52          ** PAGER
31e40 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73  _ERROR now. This
31e50 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
31e60 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72   counted as a tr
31e70 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  ansition.       
31e80 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61   ** to ERROR sta
31e90 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  te in the state 
31ea0 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74  diagram at the t
31eb0 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c  op of this file,
31ec0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63  .        ** sinc
31ed0 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  e we know that t
31ee0 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20  he same call to 
31ef0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
31f00 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20  ill very.       
31f10 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e   ** shortly tran
31f20 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72  sition the pager
31f30 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f   object to the O
31f40 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69  PEN state. Calli
31f50 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ng.        ** as
31f60 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
31f70 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f  () would fail no
31f80 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20  w, as it should 
31f90 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
31fa0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
31fb0 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
31fc0 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a  when there are z
31fd0 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ero outstanding 
31fe0 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
31ff0 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20   references..   
32000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
32010 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
32020 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
32030 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
32040 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
32050 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
32060 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
32070 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32080 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
32090 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
320a0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
320b0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
320c0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  de && pPager->eL
320d0 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
320e0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
320f0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
32100 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50  ->tempFile && pP
32110 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
32120 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  redLock ){.     
32130 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
32140 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
32150 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20  n acquired then 
32160 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a  check to.      *
32170 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  * see if the dat
32180 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
32190 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
321a0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
321b0 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  anged,.      ** 
321c0 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e  flush the cache.
321d0 20 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61    The hasHeldSha
321e0 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65  redLock flag pre
321f0 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a  vents this from.
32200 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69        ** occurri
32210 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66  ng on the very f
32220 69 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61  irst access to a
32230 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20   file, in order 
32240 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20  to save a.      
32250 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65  ** single unnece
32260 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52  ssary sqlite3OsR
32270 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68  ead() call at th
32280 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20  e start-up..    
32290 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
322a0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61  tabase changes a
322b0 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  re detected by l
322c0 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
322d0 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
322e0 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
322f0 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
32300 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
32310 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
32320 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
32330 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
32340 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
32350 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
32360 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
32370 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
32380 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
32390 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
323a0 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
323b0 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
323c0 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
323d0 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
323e0 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
323f0 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
32400 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
32410 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
32420 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
32430 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
32440 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
32450 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
32460 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
32470 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
32480 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e      */.      Pgn
32490 6f 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  o nPage = 0;.   
324a0 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
324b0 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
324c0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
324d0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
324e0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
324f0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
32500 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
32510 66 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69  failed;..      i
32520 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
32530 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
32540 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
32550 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
32560 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
32570 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32580 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
32590 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
325a0 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
325b0 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
325c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
325d0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
325e0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
325f0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
32600 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32620 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
32630 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c  mset(dbFileVers,
32640 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c   0, sizeof(dbFil
32650 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
32660 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63  ..      if( memc
32670 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  mp(pPager->dbFil
32680 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
32690 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
326a0 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20  Vers))!=0 ){.   
326b0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
326c0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  (pPager);..     
326d0 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20     /* Unmap the 
326e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
326f0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
32700 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63  at external proc
32710 65 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  esses.        **
32720 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61   may have trunca
32730 74 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ted the database
32740 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65   file and then e
32750 78 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a  xtended it back.
32760 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74          ** to it
32770 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20  s original size 
32780 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
32790 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69  ss was not holdi
327a0 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  ng a lock..     
327b0 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
327c0 73 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69  se there may exi
327d0 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20  st a Pager.pMap 
327e0 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70  mapping that app
327f0 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ears.        ** 
32800 74 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20  to be the right 
32810 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20  size but is not 
32820 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20  actually valid. 
32830 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20  Avoid this.     
32840 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74     ** possibilit
32850 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74  y by unmapping t
32860 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20  he db here. */. 
32870 20 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45         if( USEFE
32880 54 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20  TCH(pPager) ){. 
32890 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
328a0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
328b0 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->fd, 0, 0);.   
328c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
328d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
328e0 74 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66  there is a WAL f
328f0 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ile in the file-
32900 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69  system, open thi
32910 73 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41  s database in WA
32920 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f  L.    ** mode. O
32930 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f  therwise, the fo
32940 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llowing function
32950 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
32960 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
32970 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  = pagerOpenWalIf
32980 50 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b  Present(pPager);
32990 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
329a0 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73  OMIT_WAL.    ass
329b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
329c0 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  l==0 || rc==SQLI
329d0 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a  TE_OK );.#endif.
329e0 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
329f0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
32a00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
32a10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
32a20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67     rc = pagerBeg
32a30 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  inReadTransactio
32a40 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  n(pPager);.  }..
32a50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
32a60 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32a70 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
32a80 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
32a90 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
32aa0 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62  ger, &pPager->db
32ab0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69  Size);.  }.. fai
32ac0 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  led:.  if( rc!=S
32ad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32ae0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
32af0 3b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  ;.    pager_unlo
32b00 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
32b10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
32b20 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
32b30 45 4e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EN );.  }else{. 
32b40 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32b50 65 20 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52  e = PAGER_READER
32b60 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61  ;.    pPager->ha
32b70 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20  sHeldSharedLock 
32b80 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
32b90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
32ba0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
32bb0 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
32bc0 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
32bd0 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
32be0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
32bf0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
32c00 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
32c10 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
32c20 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
32c30 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
32c40 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
32c50 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
32c60 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
32c70 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
32c80 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
32c90 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
32ca0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
32cb0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
32cc0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
32cd0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
32ce0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
32cf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d   if( pPager->nMm
32d00 61 70 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c  apOut==0 && (sql
32d10 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
32d20 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
32d30 68 65 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  he)==0) ){.    p
32d40 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
32d50 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
32d60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
32d70 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
32d80 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
32d90 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
32da0 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
32db0 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
32dc0 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
32dd0 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
32de0 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
32df0 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
32e00 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
32e10 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
32e20 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
32e30 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
32e40 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
32e50 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
32e60 68 65 20 63 61 63 68 65 2c 20 69 74 20 69 73 20  he cache, it is 
32e70 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
32e80 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70  herwise, a new p
32e90 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  age object is al
32ea0 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75  located and popu
32eb0 6c 61 74 65 64 20 77 69 74 68 20 64 61 74 61 0a  lated with data.
32ec0 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ** read from the
32ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
32ee0 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74  In some cases, t
32ef0 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
32f00 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e   may.** choose n
32f10 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ot to allocate a
32f20 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74   new page object
32f30 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61   and may reuse a
32f40 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62  n existing.** ob
32f50 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74  ject with no out
32f60 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
32f70 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  ces..**.** The e
32f80 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
32f90 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
32fa0 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
32fb0 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ed to zeros the 
32fc0 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61  .** first time a
32fd0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
32fe0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20  into memory. If 
32ff0 74 68 65 20 70 61 67 65 20 72 65 71 75 65 73 74  the page request
33000 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64  ed is .** alread
33010 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 77  y in the cache w
33020 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
33030 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
33040 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64  n the extra.** d
33050 61 74 61 20 69 73 20 6c 65 66 74 20 61 73 20 69  ata is left as i
33060 74 20 77 61 73 20 77 68 65 6e 20 74 68 65 20 70  t was when the p
33070 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c  age object was l
33080 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  ast used..**.** 
33090 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
330a0 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72  image is smaller
330b0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
330c0 74 65 64 20 70 61 67 65 20 6f 72 20 69 66 20 61  ted page or if a
330d0 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61   .** non-zero va
330e0 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 61 73  lue is passed as
330f0 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70   the noContent p
33100 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65  arameter and the
33110 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70   .** requested p
33120 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
33130 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  dy stored in the
33140 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20   cache, then no 
33150 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20  .** actual disk 
33160 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20  read occurs. In 
33170 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6d 65  this case the me
33180 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
33190 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e  e .** page is in
331a0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
331b0 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   zeros. .**.** I
331c0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
331d0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
331e0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
331f0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
33200 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
33210 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
33220 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
33230 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
33240 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
33250 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
33260 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
33270 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
33280 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
33290 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
332a0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
332b0 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
332c0 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
332d0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
332e0 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
332f0 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
33300 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
33310 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
33320 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  l..**.** If noCo
33330 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ntent is true, t
33340 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74  hen the data ret
33350 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20  urned is zeroed 
33360 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65  instead of.** be
33370 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ing read from th
33380 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
33390 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69  tionally, the bi
333a0 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ts corresponding
333b0 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50  .** to pgno in P
333c0 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
333d0 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73  (bitvec of pages
333e0 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
333f0 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   to the.** journ
33400 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
33410 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
33420 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
33430 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e  vecs of any open
33440 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61  .** savepoints a
33450 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61  re set. This mea
33460 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ns if the page i
33470 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  s made writable 
33480 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20  at any.** point 
33490 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75  in the future, u
334a0 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73  sing a call to s
334b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
334c0 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  (), its contents
334d0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  .** will not be 
334e0 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20  journaled. This 
334f0 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20  saves IO..**.** 
33500 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
33510 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
33520 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
33530 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
33540 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
33550 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
33560 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
33570 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
33580 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
33590 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
335a0 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
335b0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
335c0 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
335d0 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
335e0 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
335f0 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
33600 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
33610 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
33620 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
33630 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
33640 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
33650 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
33660 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
33670 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
33680 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
33690 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
336a0 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
336b0 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
336c0 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
336d0 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
336e0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
336f0 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
33700 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
33710 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
33720 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
33730 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
33740 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
33750 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33760 50 61 67 65 72 47 65 74 28 0a 20 20 50 61 67 65  PagerGet(.  Page
33770 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
33780 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
33790 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
337a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
337b0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
337c0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
337d0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
337e0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
337f0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
33800 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
33810 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
33820 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
33830 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
33840 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
33850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33860 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
33870 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
33880 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
33890 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
338a0 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
338b0 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ile */.  const i
338c0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28  nt noContent = (
338d0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45  flags & PAGER_GE
338e0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  T_NOCONTENT);.. 
338f0 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
33900 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
33910 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
33920 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
33930 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
33940 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
33950 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
33960 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
33970 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
33980 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
33990 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
339a0 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
339b0 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
339c0 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
339d0 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
339e0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
339f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
33a00 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 3e 31  MmapOk = (pgno>1
33a10 20 26 26 20 55 53 45 46 45 54 43 48 28 70 50 61   && USEFETCH(pPa
33a20 67 65 72 29 0a 20 20 20 26 26 20 28 70 50 61 67  ger).   && (pPag
33a30 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33a40 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c 61  R_READER || (fla
33a50 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f 52  gs & PAGER_GET_R
33a60 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64 65 66  EADONLY)).#ifdef
33a70 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
33a80 43 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e  C.   && pPager->
33a90 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66  xCodec==0.#endif
33aa0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70 74 69  .  );..  /* Opti
33ab0 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  mization note:  
33ac0 41 64 64 69 6e 67 20 74 68 65 20 22 70 67 6e 6f  Adding the "pgno
33ad0 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f 72 65  <=1" term before
33ae0 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72 65 0a   "pgno==0" here.
33af0 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68 65 20    ** allows the 
33b00 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
33b10 65 72 20 74 6f 20 72 65 75 73 65 20 74 68 65 20  er to reuse the 
33b20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 22  results of the "
33b30 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74 65 73  pgno>1".  ** tes
33b40 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
33b50 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6e 64  s statement, and
33b60 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67 20 70   avoid testing p
33b70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a 20 20  gno==0 in the.  
33b80 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  ** common case w
33b90 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  here pgno is lar
33ba0 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ge. */.  if( pgn
33bb0 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d 30 20  o<=1 && pgno==0 
33bc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
33bd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33be0 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
33bf0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
33c00 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
33c10 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
33c20 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
33c30 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
33c40 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20  t( noContent==0 
33c50 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b  || bMmapOk==0 );
33c60 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
33c70 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
33c80 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 2f  dLock==1 );..  /
33c90 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
33ca0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
33cb0 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  tate, return an 
33cc0 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  error immediatel
33cd0 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  y. .  ** Otherwi
33ce0 73 65 2c 20 72 65 71 75 65 73 74 20 74 68 65 20  se, request the 
33cf0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43  page from the PC
33d00 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20  ache layer. */. 
33d10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
33d20 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code!=SQLITE_OK 
33d30 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
33d40 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
33d50 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 62 4d  else{.    if( bM
33d60 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73  mapOk && pagerUs
33d70 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
33d80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33d90 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
33da0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e  Pager->pWal, pgn
33db0 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
33dc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33dd0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67 65  E_OK ) goto page
33de0 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20  r_acquire_err;. 
33df0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4d     }..    if( bM
33e00 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d 65 3d  mapOk && iFrame=
33e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  =0 ){.      void
33e20 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a 20 20   *pData = 0;..  
33e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33e40 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
33e50 66 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  fd, .          (
33e60 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70  i64)(pgno-1) * p
33e70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
33e80 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
33e90 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20 20 20  e, &pData.      
33ea0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
33eb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
33ec0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
33ed0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
33ee0 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45 52 20  te>PAGER_READER 
33ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
33f00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
33f10 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
33f20 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  no);.        }. 
33f30 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
33f40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
33f50 63 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65  c = pagerAcquire
33f60 4d 61 70 50 61 67 65 28 70 50 61 67 65 72 2c 20  MapPage(pPager, 
33f70 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26 70 50  pgno, pData, &pP
33f80 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  g);.        }els
33f90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
33fa0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
33fb0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
33fc0 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
33fd0 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29  pageSize, pData)
33fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33ff0 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
34000 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
34010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34020 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 50  ;.          *ppP
34030 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  age = pPg;.     
34040 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
34050 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
34060 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34080 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
34090 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
340a0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
340b0 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  }..    {.      s
340c0 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
340d0 67 65 20 2a 70 42 61 73 65 3b 0a 20 20 20 20 20  ge *pBase;.     
340e0 20 70 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33   pBase = sqlite3
340f0 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
34100 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34110 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
34120 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20   pBase==0 ){.   
34130 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34140 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65  3PcacheFetchStre
34150 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ss(pPager->pPCac
34160 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65  he, pgno, &pBase
34170 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34180 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
34190 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
341a0 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 69  e_err;.        i
341b0 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20  f( pBase==0 ){. 
341c0 20 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 2a           pPg = *
341d0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
341e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
341f0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
34200 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34210 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
34220 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
34230 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65     pPg = *ppPage
34240 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34250 46 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67  FetchFinish(pPag
34260 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34270 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 20 20 20  o, pBase);.     
34280 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30 20   assert( pPg!=0 
34290 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
342a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
342b0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68  K ){.    /* Eith
342c0 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
342d0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
342e0 68 28 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20  h() returned an 
342f0 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20  error or the.   
34300 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c   ** pager was al
34310 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
34320 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
34330 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  is function was 
34340 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53  called..    ** S
34350 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20  et pPg to 0 and 
34360 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65  jump to the exce
34370 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20  ption handler.  
34380 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  */.    pPg = 0;.
34390 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
343a0 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a  cquire_err;.  }.
343b0 20 20 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28    assert( pPg==(
343c0 2a 70 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73  *ppPage) );.  as
343d0 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d  sert( pPg->pgno=
343e0 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
343f0 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  t( pPg->pPager==
34400 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70  pPager || pPg->p
34410 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
34420 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26  f( pPg->pPager &
34430 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  & !noContent ){.
34440 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
34450 61 73 65 20 74 68 65 20 70 63 61 63 68 65 20 61  ase the pcache a
34460 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20  lready contains 
34470 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63  an initialized c
34480 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  opy of.    ** th
34490 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77  e page. Return w
344a0 69 74 68 6f 75 74 20 66 75 72 74 68 65 72 20 61  ithout further a
344b0 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  do.  */.    asse
344c0 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f  rt( pgno<=PAGER_
344d0 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f  MAX_PGNO && pgno
344e0 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
344f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70  pPager) );.    p
34500 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
34510 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a  ER_STAT_HIT]++;.
34520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
34530 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a  E_OK;..  }else{.
34540 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
34550 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
34560 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
34570 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
34580 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
34590 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a  nitialized.  */.
345a0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
345b0 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20   = pPager;..    
345c0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
345d0 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
345e0 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
345f0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
34600 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  age.    ** numbe
34610 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
34620 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73  his, or the unus
34630 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c  ed locking-page,
34640 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a   is requested. *
34650 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50  /.    if( pgno>P
34660 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
34670 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
34680 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
34690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
346a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
346b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
346c0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
346d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d 45 4d    }..    if( MEM
346e0 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  DB || pPager->db
346f0 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43  Size<pgno || noC
34700 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f 70 65  ontent || !isOpe
34710 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
34720 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
34730 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
34740 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
34750 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
34760 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34770 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34780 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
34790 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
347a0 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
347b0 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
347c0 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
347d0 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
347e0 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
347f0 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
34800 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
34810 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
34820 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
34830 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
34840 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
34850 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
34860 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
34870 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
34880 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
34890 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
348a0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
348b0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
348c0 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
348d0 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
348e0 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
348f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
34900 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
34910 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
34920 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
34930 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
34940 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
34950 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
34960 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
34970 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
34980 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
34990 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
349a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
349b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
349c0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
349d0 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
349e0 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
349f0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
34a00 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
34a10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
34a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
34a30 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
34a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
34a50 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
34a60 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
34a70 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 49 4f  eSize);.      IO
34a80 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
34a90 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
34aa0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
34ab0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  {.      if( page
34ac0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
34ad0 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 7b  && bMmapOk==0 ){
34ae0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34af0 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d  lite3WalFindFram
34b00 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
34b10 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a  pgno, &iFrame);.
34b20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34b30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34b40 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34b50 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
34b60 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34b70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b  Pager==pPager );
34b80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
34b90 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
34ba0 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72  MISS]++;.      r
34bb0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
34bc0 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20 20  Pg, iFrame);.   
34bd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
34be0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
34bf0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
34c00 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
34c10 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f      }.    pager_
34c20 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
34c30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
34c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
34c50 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a 0a  er_acquire_err:.
34c60 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
34c70 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
34c80 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c 69   pPg ){.    sqli
34c90 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
34ca0 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55  g);.  }.  pagerU
34cb0 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
34cc0 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61 67  ager);..  *ppPag
34cd0 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
34ce0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
34cf0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
34d00 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
34d10 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
34d20 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
34d30 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
34d40 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
34d50 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
34d60 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
34d70 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
34d80 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a 2a 2a  ot in cache. .**
34d90 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
34da0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
34db0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
34dc0 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
34dd0 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
34de0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
34df0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
34e00 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
34e10 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
34e20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
34e30 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
34e40 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
34e50 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
34e60 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
34e70 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
34e80 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
34e90 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
34ea0 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
34eb0 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
34ec0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
34ed0 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
34ee0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
34ef0 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
34f00 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  page *pPage;.  a
34f10 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
34f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
34f30 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no!=0 );.  asser
34f40 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  t( pPager->pPCac
34f50 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  he!=0 );.  pPage
34f60 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34f70 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
34f80 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 29 3b  Cache, pgno, 0);
34f90 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34fa0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 68  ==0 || pPager->h
34fb0 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
34fc0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 3d   );.  if( pPage=
34fd0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
34fe0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
34ff0 63 61 63 68 65 46 65 74 63 68 46 69 6e 69 73 68  cacheFetchFinish
35000 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
35010 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29 3b 0a  , pgno, pPage);.
35020 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
35030 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63   a page referenc
35040 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
35050 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
35060 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
35070 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
35080 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
35090 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
350a0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
350b0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
350c0 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
350d0 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
350e0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
350f0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
35100 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
35110 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f  * removed..*/.vo
35120 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
35130 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
35140 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
35150 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61 73 73  r *pPager;.  ass
35160 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20  ert( pPg!=0 );. 
35170 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
35180 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67  Pager;.  if( pPg
35190 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
351a0 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61 67 65  MMAP ){.    page
351b0 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28  rReleaseMapPage(
351c0 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pPg);.  }else{. 
351d0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
351e0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
351f0 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
35200 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
35210 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
35220 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
35230 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
35240 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
35250 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
35260 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
35270 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
35280 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
35290 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
352a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
352b0 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
352c0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
352d0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
352e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
352f0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
35300 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
35310 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
35320 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
35330 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
35340 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
35350 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
35360 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
35370 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
35380 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
35390 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
353a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
353b0 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
353c0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
353d0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
353e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
353f0 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
35400 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
35410 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
35420 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
35430 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
35440 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
35450 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
35460 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
35470 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
35480 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
35490 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
354a0 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
354b0 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
354c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
354d0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
354e0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
354f0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
35500 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
35510 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
35520 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
35530 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
35540 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
35550 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
35560 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
35570 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
35580 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
35590 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
355a0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
355b0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
355c0 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
355d0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
355e0 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
355f0 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
35600 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
35610 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
35620 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
35630 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
35640 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
35650 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
35660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
35670 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
35680 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
35690 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
356a0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
356b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
356c0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
356d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
356e0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
356f0 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
35700 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
35710 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
35720 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35730 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35740 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
35750 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
35760 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
35770 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
35780 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
35790 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
357a0 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
357b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
357c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
357d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
357e0 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
357f0 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
35800 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
35810 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
35820 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
35830 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
35840 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
35850 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
35860 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
35870 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28  >errCode;..  if(
35880 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
35890 61 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d  ager) && pPager-
358a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
358b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
358c0 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OFF ){.    pPage
358d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
358e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
358f0 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
35900 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
35910 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
35920 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
35930 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
35940 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
35950 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
35960 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  l file if it is 
35970 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
35980 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73  . */.    if( !is
35990 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
359a0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
359b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
359c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
359d0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
359e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
359f0 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
35a00 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
35a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
35a20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
35a30 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
35a40 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
35a50 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
35a60 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
35a70 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
35a80 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
35a90 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
35aa0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
35ab0 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
35ac0 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
35ad0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
35ae0 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
35af0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20  TEMP_JOURNAL):. 
35b00 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
35b10 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
35b20 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 20 20  RNAL).          
35b30 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 56  );..        /* V
35b40 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
35b50 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61  atabase still ha
35b60 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
35b70 61 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20  as it did when. 
35b80 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73         ** it was
35b90 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e   originally open
35ba0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ed. */.        r
35bb0 63 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e  c = databaseIsUn
35bc0 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20  moved(pPager);. 
35bd0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
35be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 64  QLITE_OK ){.#ifd
35bf0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35c00 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
35c10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
35c20 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
35c30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
35c40 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
35c50 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
35c60 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
35c70 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
35c80 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 23  ).          );.#
35c90 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72  else.          r
35ca0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
35cb0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
35cc0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
35cd0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
35ce0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
35cf0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
35d00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
35d10 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
35d20 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
35d30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20  .    }.  .  .   
35d40 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
35d50 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
35d60 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  er to the journa
35d70 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20  l file and open 
35d80 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
35d90 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
35da0 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sary..    */.   
35db0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35dc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
35dd0 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
35de0 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
35df0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
35e00 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
35e10 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
35e20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35e30 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
35e40 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
35e50 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
35e60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
35e70 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   0;.      rc = w
35e80 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
35e90 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
35ea0 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
35eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
35ec0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
35ed0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
35ee0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
35ef0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
35f00 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
35f10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35f20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
35f30 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
35f40 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
35f50 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45  te = PAGER_WRITE
35f60 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a  R_CACHEMOD;.  }.
35f70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
35f80 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77  ./*.** Begin a w
35f90 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
35fa0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
35fb0 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  d pager object. 
35fc0 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74  If a .** write-t
35fd0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
35fe0 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
35ff0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
36000 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
36010 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61  .** If the exFla
36020 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  g argument is fa
36030 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  lse, then acquir
36040 65 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  e at least a RES
36050 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e  ERVED.** lock on
36060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36070 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73  le. If exFlag is
36080 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75   true, then acqu
36090 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  ire at least.** 
360a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
360b0 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  k. If such a loc
360c0 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
360d0 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a  d, no locking .*
360e0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64  * functions need
360f0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   be called..**.*
36100 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  * If the subjInM
36110 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
36120 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
36130 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   any sub-journal
36140 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69   opened.** withi
36150 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
36160 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  on will be opene
36170 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  d as an in-memor
36180 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20  y file. This.** 
36190 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66  has no effect if
361a0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
361b0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
361c0 65 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ed (as it may be
361d0 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67   when.** running
361e0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
361f0 64 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72  de) or if the tr
36200 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e  ansaction does n
36210 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20  ot require a.** 
36220 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  sub-journal. If 
36230 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  the subjInMemory
36240 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72   argument is zer
36250 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75  o, then any requ
36260 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  ired.** sub-jour
36270 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  nal is implement
36280 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20  ed in-memory if 
36290 70 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d  pPager is an in-
362a0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
362b0 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20   .** or using a 
362c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f  temporary file o
362d0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
362e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
362f0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
36300 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e  , int exFlag, in
36310 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b  t subjInMemory){
36320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
36330 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
36340 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
36350 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
36360 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  rrCode;.  assert
36370 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
36380 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 26  >=PAGER_READER &
36390 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
363a0 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  <PAGER_ERROR );.
363b0 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e    pPager->subjIn
363c0 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62  Memory = (u8)sub
363d0 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66  jInMemory;..  if
363e0 28 20 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d  ( ALWAYS(pPager-
363f0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
36400 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73  EADER) ){.    as
36410 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
36420 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a  nJournal==0 );..
36430 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
36440 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
36450 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
36460 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72  ager is configur
36470 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e  ed to use lockin
36480 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
36490 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a  , and an.      *
364a0 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  * exclusive lock
364b0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
364c0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
364d0 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20  held, obtain it 
364e0 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  now..      */.  
364f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
36500 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
36510 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75   sqlite3WalExclu
36520 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d  siveMode(pPager-
36530 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20  >pWal, -1) ){.  
36540 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
36550 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
36560 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
36570 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
36580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
365a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
365b0 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
365c0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
365d0 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
365e0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  1);.      }..   
365f0 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77     /* Grab the w
36600 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
36610 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75   log file. If su
36620 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64  ccessful, upgrad
36630 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41  e to.      ** PA
36640 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
36650 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  te. Otherwise, r
36660 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
36670 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
36680 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  r..      ** The 
36690 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20  busy-handler is 
366a0 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61  not invoked if a
366b0 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
366c0 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  n already.      
366d0 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69  ** holds the wri
366e0 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73  te-lock. If poss
366f0 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20  ible, the upper 
36700 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  layer will call 
36710 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  it..      */.   
36720 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
36730 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
36740 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
36750 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pWal);.    }else
36760 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  {.      /* Obtai
36770 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
36780 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36790 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65  e file. If the e
367a0 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a  xFlag parameter.
367b0 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65        ** is true
367c0 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
367d0 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
367e0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
367f0 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20  lock. The.      
36800 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ** busy-handler 
36810 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20  callback can be 
36820 75 73 65 64 20 77 68 65 6e 20 75 70 67 72 61 64  used when upgrad
36830 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55  ing to the EXCLU
36840 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  SIVE.      ** lo
36850 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
36860 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
36870 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
36880 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
36890 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
368a0 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
368b0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
368c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
368d0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
368e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
368f0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
36900 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
36910 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
36920 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
36930 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36940 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57    /* Change to W
36950 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
36960 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
36970 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73     ** WAL mode s
36980 65 74 73 20 50 61 67 65 72 2e 65 53 74 61 74 65  ets Pager.eState
36990 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52   to PAGER_WRITER
369a0 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45  _LOCKED or CACHE
369b0 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  MOD.      ** whe
369c0 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e  n it has an open
369d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75   transaction, bu
369e0 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44  t never to DBMOD
369f0 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20   or FINISHED..  
36a00 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62      ** This is b
36a10 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20  ecause in those 
36a20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  states the code 
36a30 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
36a40 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
36a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61   transactions ma
36a60 79 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  y copy data from
36a70 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
36a80 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
36a90 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  se .      ** fil
36aa0 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74  e as well as int
36ab0 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  o the page cache
36ac0 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65  . Which would be
36ad0 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20   incorrect in . 
36ae0 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
36af0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36b00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
36b10 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  = PAGER_WRITER_L
36b20 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61  OCKED;.      pPa
36b30 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
36b40 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
36b50 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
36b60 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61  dbFileSize = pPa
36b70 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
36b80 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69     pPager->dbOri
36b90 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
36ba0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50  dbSize;.      pP
36bb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
36bc0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
36bd0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
36be0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
36bf0 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
36c00 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73  READER );.    as
36c10 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
36c20 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
36c30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36c40 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
36c50 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
36c60 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
36c70 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50  ger) );.  }..  P
36c80 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e  AGERTRACE(("TRAN
36c90 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
36ca0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
36cb0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
36cc0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61  ../*.** Write pa
36cd0 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20  ge pPg onto the 
36ce0 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  end of the rollb
36cf0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ack journal..*/.
36d00 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
36d10 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72  INLINE int pager
36d20 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63  AddPageToRollbac
36d30 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a  kJournal(PgHdr *
36d40 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
36d50 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36d60 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ger;.  int rc;. 
36d70 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 63 68   u32 cksum;.  ch
36d80 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 69 36  ar *pData2;.  i6
36d90 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  4 iOff = pPager-
36da0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
36db0 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
36dc0 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
36dd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
36de0 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a 2a 20   page that.  ** 
36df0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
36e00 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
36e10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
36e20 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 2a 2a  rt verifies.  **
36e30 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
36e40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
36e50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
36e60 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
36e70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
36e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c  ger->journalHdr<
36e90 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
36ea0 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43 32 28  Off );.  CODEC2(
36eb0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
36ec0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
36ed0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
36ee0 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
36ef0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
36f00 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
36f10 38 2a 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f  8*)pData2);..  /
36f20 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
36f30 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
36f40 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a  r occurs while j
36f50 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
36f60 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
36f70 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74  block above, set
36f80 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66   the need-sync f
36f90 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65  lag for the page
36fa0 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
36fb0 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
36fc0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
36fd0 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
36fe0 20 69 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63   in.  ** playbac
36ff0 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c  k_one_page() wil
37000 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65  l think that the
37010 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
37020 65 20 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20  e restored.  ** 
37030 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
37040 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
37050 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
37060 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
37070 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
37080 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
37090 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
370a0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
370b0 5f 53 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77  _SYNC;..  rc = w
370c0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
370d0 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50  r->jfd, iOff, pP
370e0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  g->pgno);.  if( 
370f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37100 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
37110 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
37120 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
37130 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
37140 67 65 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b  geSize, iOff+4);
37150 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
37160 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
37170 3b 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ;.  rc = write32
37180 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
37190 2c 20 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70  , iOff+pPager->p
371a0 61 67 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d  ageSize+4, cksum
371b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
371c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
371d0 72 63 3b 0a 0a 20 20 49 4f 54 52 41 43 45 28 28  rc;..  IOTRACE((
371e0 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
371f0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
37200 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
37210 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
37220 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
37230 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
37240 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
37250 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
37260 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
37270 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
37280 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
37290 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
372a0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 50 41 47  )\n",.       PAG
372b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
372c0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
372d0 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
372e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
372f0 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
37300 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 70  ash(pPg)));..  p
37310 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
37320 66 20 2b 3d 20 38 20 2b 20 70 50 61 67 65 72 2d  f += 8 + pPager-
37330 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61  >pageSize;.  pPa
37340 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61  ger->nRec++;.  a
37350 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
37360 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
37370 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
37380 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
37390 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
373a0 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61  >pgno);.  testca
373b0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
373c0 4f 4d 45 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  OMEM );.  assert
373d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
373e0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
373f0 4d 45 4d 20 29 3b 0a 20 20 72 63 20 7c 3d 20 61  MEM );.  rc |= a
37400 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
37410 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
37420 2d 3e 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  ->pgno);.  asser
37430 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
37440 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
37450 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e  OMEM );.  return
37460 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
37470 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
37480 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
37490 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
374a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
374b0 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
374c0 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
374d0 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
374e0 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
374f0 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
37500 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
37510 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
37520 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
37530 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
37540 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
37550 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
37560 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
37570 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
37580 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
37590 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
375a0 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
375b0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
375c0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
375d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
375e0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
375f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37600 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72  OK;..  /* This r
37610 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 63 61  outine is not ca
37620 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20 77 72  lled unless a wr
37630 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
37640 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20 20 2a  has already .  *
37650 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64 2e 20  * been started. 
37660 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
37670 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
37680 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20  be open at this 
37690 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74 20 69  point..  ** It i
376a0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
376b0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
376c0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
376d0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
376e0 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
376f0 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  OCKED.       || 
37700 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37710 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
37720 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20  HEMOD.       || 
37730 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
37740 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
37750 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  OD.  );.  assert
37760 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
37770 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
37780 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37790 2d 3e 65 72 72 43 6f 64 65 3d 3d 30 20 29 3b 0a  ->errCode==0 );.
377a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
377b0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b  ->readOnly==0 );
377c0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
377d0 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f  g);..  /* The jo
377e0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
377f0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48   to be opened. H
37800 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
37810 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ines have alread
37820 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20  y.  ** obtained 
37830 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
37840 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65  cks to begin the
37850 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37860 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a  on, but the.  **
37870 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
37880 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20  l might not yet 
37890 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74  be open. Open it
378a0 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20   now if this is 
378b0 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  the case..  **. 
378c0 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65   ** This is done
378d0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
378e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
378f0 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20  eDirty() on the 
37900 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  page. .  ** Othe
37910 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72  rwise, if it wer
37920 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c  e done after cal
37930 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
37940 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74  heMakeDirty(), t
37950 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f  hen.  ** an erro
37960 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e  r might occur an
37970 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c  d the pager woul
37980 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54  d end up in WRIT
37990 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a  ER_LOCKED state.
379a0 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20    ** with pages 
379b0 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
379c0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  in the cache..  
379d0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
379e0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
379f0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
37a00 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
37a10 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
37a20 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
37a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
37a40 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
37a50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
37a60 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
37a70 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
37a80 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
37a90 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
37aa0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  er) );..  /* Mar
37ab0 6b 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  k the page that 
37ac0 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 6d  is about to be m
37ad0 6f 64 69 66 69 65 64 20 61 73 20 64 69 72 74 79  odified as dirty
37ae0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63  . */.  sqlite3Pc
37af0 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
37b00 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 72  g);..  /* If a r
37b10 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
37b20 69 73 20 69 6e 20 75 73 65 2c 20 74 68 65 6d 20  is in use, them 
37b30 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 61  make sure the pa
37b40 67 65 20 74 68 61 74 20 69 73 20 61 62 6f 75 74  ge that is about
37b50 0a 20 20 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  .  ** to change 
37b60 69 73 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  is in the rollba
37b70 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ck journal, or i
37b80 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20  f the page is a 
37b90 6e 65 77 20 70 61 67 65 20 6f 66 66 0a 20 20 2a  new page off.  *
37ba0 2a 20 74 68 65 6e 20 65 6e 64 20 6f 66 20 74 68  * then end of th
37bb0 65 20 66 69 6c 65 2c 20 6d 61 6b 65 20 73 75 72  e file, make sur
37bc0 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61  e it is marked a
37bd0 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
37be0 43 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  C..  */.  assert
37bf0 28 20 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ( (pPager->pInJo
37c00 75 72 6e 61 6c 21 3d 30 29 20 3d 3d 20 69 73 4f  urnal!=0) == isO
37c10 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
37c20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
37c30 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a  ->pInJournal!=0.
37c40 20 20 20 26 26 20 73 71 6c 69 74 65 33 42 69 74     && sqlite3Bit
37c50 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
37c60 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37c70 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30  l, pPg->pgno)==0
37c80 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
37c90 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
37ca0 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ager)==0 );.    
37cb0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  if( pPg->pgno<=p
37cc0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
37cd0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
37ce0 70 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f  pagerAddPageToRo
37cf0 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 70 50  llbackJournal(pP
37d00 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
37d10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37d20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
37d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
37d40 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70  lse{.      if( p
37d50 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
37d60 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
37d70 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  D ){.        pPg
37d80 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
37d90 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
37da0 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54    }.      PAGERT
37db0 52 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64  RACE(("APPEND %d
37dc0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
37dd0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
37de0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
37df0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
37e00 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
37e10 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
37e20 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
37e30 30 29 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  0)));.    }.  }.
37e40 0a 20 20 2f 2a 20 54 68 65 20 50 47 48 44 52 5f  .  /* The PGHDR_
37e50 44 49 52 54 59 20 62 69 74 20 69 73 20 73 65 74  DIRTY bit is set
37e60 20 61 62 6f 76 65 20 77 68 65 6e 20 74 68 65 20   above when the 
37e70 70 61 67 65 20 77 61 73 20 61 64 64 65 64 20 74  page was added t
37e80 6f 20 74 68 65 20 64 69 72 74 79 2d 6c 69 73 74  o the dirty-list
37e90 0a 20 20 2a 2a 20 61 6e 64 20 62 65 66 6f 72 65  .  ** and before
37ea0 20 77 72 69 74 69 6e 67 20 74 68 65 20 70 61 67   writing the pag
37eb0 65 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  e into the rollb
37ec0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 61  ack journal.  Wa
37ed0 69 74 20 75 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20  it until now,.  
37ee0 2a 2a 20 61 66 74 65 72 20 74 68 65 20 70 61 67  ** after the pag
37ef0 65 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  e has been succe
37f00 73 73 66 75 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c  ssfully journall
37f10 65 64 2c 20 62 65 66 6f 72 65 20 73 65 74 74 69  ed, before setti
37f20 6e 67 20 74 68 65 0a 20 20 2a 2a 20 50 47 48 44  ng the.  ** PGHD
37f30 52 5f 57 52 49 54 45 41 42 4c 45 20 62 69 74 20  R_WRITEABLE bit 
37f40 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74  that indicates t
37f50 68 61 74 20 74 68 65 20 70 61 67 65 20 63 61 6e  hat the page can
37f60 20 62 65 20 73 61 66 65 6c 79 20 6d 6f 64 69 66   be safely modif
37f70 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ied..  */.  pPg-
37f80 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
37f90 57 52 49 54 45 41 42 4c 45 3b 0a 20 20 0a 20 20  WRITEABLE;.  .  
37fa0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
37fb0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
37fc0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
37fd0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
37fe0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
37ff0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
38000 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
38010 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  al..  */.  if( p
38020 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
38030 74 3e 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  t>0 ){.    rc = 
38040 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66  subjournalPageIf
38050 52 65 71 75 69 72 65 64 28 70 50 67 29 3b 0a 20  Required(pPg);. 
38060 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
38070 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
38080 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 2a 2f  e and return. */
38090 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
380a0 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
380b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
380c0 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
380d0 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  o;.  }.  return 
380e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
380f0 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f  s is a variant o
38100 66 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  f sqlite3PagerWr
38110 69 74 65 28 29 20 74 68 61 74 20 72 75 6e 73 20  ite() that runs 
38120 77 68 65 6e 20 74 68 65 20 73 65 63 74 6f 72 20  when the sector 
38130 73 69 7a 65 0a 2a 2a 20 69 73 20 6c 61 72 67 65  size.** is large
38140 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20  r than the page 
38150 73 69 7a 65 2e 20 20 53 51 4c 69 74 65 20 6d 61  size.  SQLite ma
38160 6b 65 73 20 74 68 65 20 28 72 65 61 73 6f 6e 61  kes the (reasona
38170 62 6c 65 29 20 61 73 73 75 6d 70 74 69 6f 6e 20  ble) assumption 
38180 74 68 61 74 0a 2a 2a 20 61 6c 6c 20 62 79 74 65  that.** all byte
38190 73 20 6f 66 20 61 20 73 65 63 74 6f 72 20 61 72  s of a sector ar
381a0 65 20 77 72 69 74 74 65 6e 20 74 6f 67 65 74 68  e written togeth
381b0 65 72 20 62 79 20 68 61 72 64 77 61 72 65 2e 20  er by hardware. 
381c0 20 48 65 6e 63 65 2c 20 61 6c 6c 20 62 79 74 65   Hence, all byte
381d0 73 20 6f 66 0a 2a 2a 20 61 20 73 65 63 74 6f 72  s of.** a sector
381e0 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72   need to be jour
381f0 6e 61 6c 6c 65 64 20 69 6e 20 63 61 73 65 20 6f  nalled in case o
38200 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 69  f a power loss i
38210 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
38220 2a 2a 20 61 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a  ** a write..**.*
38230 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 73  * Usually, the s
38240 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 6c 65  ector size is le
38250 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
38260 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
38270 65 2c 20 69 6e 20 77 68 69 63 68 0a 2a 2a 20 63  e, in which.** c
38280 61 73 65 20 70 61 67 65 73 20 63 61 6e 20 62 65  ase pages can be
38290 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 77 72   individually wr
382a0 69 74 74 65 6e 2e 20 20 54 68 69 73 20 72 6f 75  itten.  This rou
382b0 74 69 6e 65 20 6f 6e 6c 79 20 72 75 6e 73 20 69  tine only runs i
382c0 6e 20 74 68 65 0a 2a 2a 20 65 78 63 65 70 74 69  n the.** excepti
382d0 6f 6e 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  onal case where 
382e0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
382f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
38300 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  e sector size..*
38310 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
38320 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67  NOINLINE int pag
38330 65 72 57 72 69 74 65 4c 61 72 67 65 53 65 63 74  erWriteLargeSect
38340 6f 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  or(PgHdr *pPg){.
38350 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
38360 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
38370 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
38380 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75  .  Pgno nPageCou
38390 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
383a0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
383b0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
383c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
383d0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
383e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
383f0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
38400 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
38410 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
38420 69 6e 74 20 6e 50 61 67 65 20 3d 20 30 3b 20 20  int nPage = 0;  
38430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38440 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
38450 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
38460 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
38470 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
38480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38490 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
384a0 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
384b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
384c0 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
384d0 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45  ge has PGHDR_NEE
384e0 44 5f 53 59 4e 43 20 2a 2f 0a 20 20 50 61 67 65  D_SYNC */.  Page
384f0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
38500 3e 70 50 61 67 65 72 3b 20 2f 2a 20 54 68 65 20  >pPager; /* The 
38510 70 61 67 65 72 20 74 68 61 74 20 6f 77 6e 73 20  pager that owns 
38520 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50  pPg */.  Pgno nP
38530 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
38540 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
38550 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
38560 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ize);..  /* Set 
38570 74 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  the doNotSpill N
38580 4f 53 59 4e 43 20 62 69 74 20 74 6f 20 31 2e 20  OSYNC bit to 1. 
38590 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
385a0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a  we cannot allow.
385b0 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 68    ** a journal h
385c0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
385d0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
385e0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
385f0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  by.  ** this fun
38600 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  ction..  */.  as
38610 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
38620 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
38630 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
38640 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
38650 29 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 72  )==0 );.  pPager
38660 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
38670 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43  SPILLFLAG_NOSYNC
38680 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 74 72 69  ;..  /* This tri
38690 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
386a0 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
386b0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
386c0 7a 65 20 61 72 65 0a 20 20 2a 2a 20 61 6e 20 69  ze are.  ** an i
386d0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
386e0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
386f0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 t